Beste mensen,
Ik zit even met een vraagje. Ik moet een xml importeren bestaande uit zo'n 30.000 elementen, deze moeten allemaal de database in. XML wordt dagelijks ingelezen.
Helaas is het niet mogelijk om dagelijks alleen nieuwe en/of gewijzigde elementen te ontvangen, ik moet dus altijd het volledige bestand inlezen. Ook wordt er in de XML niet bijgehouden of er een element gemuteerd is sinds de laatste export van het bestand.
Wanneer ik een nieuw Eloquent model aanmaak, in dit geval Chapter, deze een id geef en dan save() aanroep krijg ik een error betreffende duplicate key. Helaas is er nu geen ondersteuning om dan automatisch een update uit te voeren.
In mijn ogen zijn er drie manieren om dit te ondervangen.
Ik zou eerst kunnen kijken of ik het model aan kan maken vanuit de database gegevens en dan kijken of het Object niet null is. Indien null een nieuwe aanmaken. Vb:
Deze manier lijkt mij te database intensief?
De manier waarop ik het nu heb is een nieuw chapter aanmaken, de save() methode in een try catch blok. Indien er een exception optreed het Object aanmaken vanuit de database en dan save() aanroepen. Vb:
De derde manier is gewoon raw sql gebruiken.
Ik ben juist een framework gaan gebruiken om dit soort zaken te vereenvoudigen, dus manier drie heeft niet mijn voorkeur.
Maar kwa performance lijkt mij dit wel de betere manier, of vergis ik mij hier?
Zijn er wellicht nog andere en betere mogelijkheden?
Een klein tweede vraagje, het XML bestand wat ik importeer is zo'n 60MB, zou het beter zijn om deze met bijvoorbeeld Python in te lezen?
Ik zit even met een vraagje. Ik moet een xml importeren bestaande uit zo'n 30.000 elementen, deze moeten allemaal de database in. XML wordt dagelijks ingelezen.
Helaas is het niet mogelijk om dagelijks alleen nieuwe en/of gewijzigde elementen te ontvangen, ik moet dus altijd het volledige bestand inlezen. Ook wordt er in de XML niet bijgehouden of er een element gemuteerd is sinds de laatste export van het bestand.
Wanneer ik een nieuw Eloquent model aanmaak, in dit geval Chapter, deze een id geef en dan save() aanroep krijg ik een error betreffende duplicate key. Helaas is er nu geen ondersteuning om dan automatisch een update uit te voeren.
In mijn ogen zijn er drie manieren om dit te ondervangen.
Ik zou eerst kunnen kijken of ik het model aan kan maken vanuit de database gegevens en dan kijken of het Object niet null is. Indien null een nieuwe aanmaken. Vb:
PHP:
1
2
3
4
5
6
7
8
9
| $chapter = Chapter::find($chapterElement->attributes()->id); if ($chapter === null) { $chapter = new Chapter(); } $chapter->id = $chapterElement->attributes()->id; $chapter->structureOrder = $chapterElement->attributes()->structureorder; $chapter->description = $chapterElement->descriptions->description[0]; $chapter->descriptionClean = Str::slug(Patchwork\Utf8::utf8_encode($chapterElement->descriptions->description[0])); $chapter->save(); |
Deze manier lijkt mij te database intensief?
De manier waarop ik het nu heb is een nieuw chapter aanmaken, de save() methode in een try catch blok. Indien er een exception optreed het Object aanmaken vanuit de database en dan save() aanroepen. Vb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| $doc = new DOMDocument(); $doc->load($this->location . $this->file); $xml = simplexml_import_dom($doc); foreach($xml->chapter as $chapterElement) { $chapter = new Chapter(); $chapter->id = $chapterElement->attributes()->id; $chapter->structureOrder = $chapterElement->attributes()->structureorder; $chapter->description = $chapterElement->descriptions->description[0]; $chapter->descriptionClean = Str::slug(Patchwork\Utf8::utf8_encode($chapterElement->descriptions->description[0])); try { $chapter->save(); } catch(Exception $e) { $chapter = Chapter::find($chapterElement->attributes()->id); if ($chapter !== null) { $chapter->id = $chapterElement->attributes()->id; $chapter->structureOrder = $chapterElement->attributes()->structureorder; $chapter->description = $chapterElement->descriptions->description[0]; $chapter->descriptionClean = Str::slug(Patchwork\Utf8::utf8_encode($chapterElement->descriptions->description[0])); $chapter->save(); } } } |
De derde manier is gewoon raw sql gebruiken.
code:
1
| INSERT INTO table SET id = key, foo = bar ON DUPLICATE KEY UPDATE foo = bar |
Ik ben juist een framework gaan gebruiken om dit soort zaken te vereenvoudigen, dus manier drie heeft niet mijn voorkeur.
Maar kwa performance lijkt mij dit wel de betere manier, of vergis ik mij hier?
Zijn er wellicht nog andere en betere mogelijkheden?
Een klein tweede vraagje, het XML bestand wat ik importeer is zo'n 60MB, zou het beter zijn om deze met bijvoorbeeld Python in te lezen?
[ Voor 0% gewijzigd door Donderpoes op 04-10-2013 09:55 . Reden: Foutje in code ]