Viacnásobný insert do databázy

publikované: od: Tibor Piňo

V dnešnom článku si ukážeme, akým spôsobom môžeme do databázy vkladať veľké množstvá dát pomocou jedného save príkazu.

Určite každý z nás už riešil situáciu, kedy bolo potrebné vložiť na jedenkrát do databázy väčšie množstvo dát. Dnes si ukážeme dva spôsoby, ako takúto situáciu efektívne vyriešiť v CakePHP.

Vkladáme dáta v cykle

Prvou z možností je vkladať dáta do databázy ich postupným prechádzaním a každú položku vložiť samostatným zavolaním metódy save() pomocou nášho modelu. Predpokladajme, že chceme vložiť niekoľko obrázkov uložených v jednom poli. Kód by mohol vyzerať následovne

//data to insert
$pictures = array
(
  [0] =>
    [Picture] => Array
        (
            [name] => 'a.jpg'
        )
  [1] =>
    [Picture] => Array
        (
            [name] => 'b.jpg'
        )
  [2]=>
    [Picture] => Array
        (
            [name] => 'c.jpg'
        )
)

for($i;$i<count($pictures);$i++) {
     $this->Picture->create();
     $this->Picture->save($picture[$i]);
}

Takým spôsobom by sme dosiahli úspešné vloženie všetkých našich obrázkov z poľa pictures. I keď tento spôsob nespĺňa podmienky hromadného vkladania dát pomocou jedného príkazu save(), uvádzame ho z dôvodu, že ak by sme zabudli na zavolanie metódy create() pred každým volaním metódy save(), výsledok by bol taký, že do databázy by sa nám uložil len posledný prvok v poli pictures. Toto správanie je spôsobené tým, že CakePHP by pri prvom inserte vložil prvok do databázy a všetky ostatné volanie metódy save() by boli len update prvého vloženého záznamu. Tým by sme dospeli k záveru, že v databáze by sa nachádzal vždy iba posledný prvok z daného poľa. Preto je nevyhnutné volať metódu create() pred každým zavolaním metódy save(), ktorá nám pripraví model pre vloženie nového záznamu.

Vkladáme dát jedným save príkazom

Druhým spôsobom je využiť metódu saveAll() , ktorá príjíma ako parameter pole s viacnásobnými údajmi a dokáže ich uložiť jediným zavolaním tejto metódy. Vyššie uvedený príklad by mohol pomocou tejto metódy vyzerať následovne

$pictures = array
(
  [0] =>
    [Picture] => Array
        (
            [name] => 'a.jpg'
        )
  [1] =>

    [Picture] => Array
        (
            [name] => 'b.jpg'
        )
  [2]=>
    [Picture] => Array
        (
            [name] => 'c.jpg'
        )
)

$this->saveAll($pictures);

Metóda saveAll() má taktiež implementované transakcie a ak potrebujeme zaručiť, že sa uložia buď všetky položky v poli, alebo v prípade chyby žiadna, musíme nastaviť parameter atomic na hodnotu true

$this->saveAll($pictures,array('atomic'=>true);

Týmto je náš článok u konca a verím, že vám tieto rady budú nápomocné.

VN:F [1.8.3_1051]
Rating: 0.0/5 (0 votes cast)