2014-07-20 10 views
6

ich ein Array haben $articles wie dieseCakePHP 3.0: Wie führe ich eine Einfügung bei der Schlüsselaktualisierung durch?

[ 
    (int) 0 => [ 
     'id' => '[email protected]', 
     'xe_dsca' => 'ÜP2768G/1', 
     'xe_citg' => '1F0200', 
     'xe_cuni' => 'stk', 
     'xe_seak' => 'ÜP2768G/1', 
     'xe_seab' => '', 
     'xe_wght' => '0.0153', 
     'xe_cwun' => 'kg', 
     'xe_wgap' => '2', 
     'xe_seri' => '2', 
     'xe_ltct' => '2', 
     'xe_qual' => '2', 
     'xe_hama' => '2', 
     'xe_ctyo' => 'DE', 
     'xe_ccde' => '85045095', 
     'xe_cpln' => '240000', 
     'xe_spar' => '2', 
     'xe_wear' => '2', 
     'xe_ctyo_de' => null, 
     'xe_cean' => null, 
     'xe_ewm_dsce' => null, 
     'xe_cood' => null, 
     'xe_ewm_dsne' => null, 
     'xe_ewm_dsge' => null, 
     'xe_ewm_dsen' => null, 
     'xe_ewm_dscz' => null, 
     'xe_wgh1' => null, 
     'xe_wgh2' => null, 
     'xe_wgh3' => null 
    ], 
    (int) 1 => [ 
     'id' => '000-000500-00000', 
     'xe_dsca' => 'DUMMY ZEITBUCHUNG', 
     'xe_citg' => '1F0800', 
     'xe_cuni' => 'stk', 
     'xe_seak' => 'DUMMY ZEITBUCHUN', 
     'xe_seab' => '000-000500-00000', 
     'xe_wght' => '0', 
     'xe_cwun' => 'kg', 
     'xe_wgap' => '2', 
     'xe_seri' => '2', 
     'xe_ltct' => '2', 
     'xe_qual' => '2', 
     'xe_hama' => '2', 
     'xe_ccde' => '000', 
     'xe_cpln' => '930000', 
     'xe_spar' => '2', 
     'xe_wear' => '2', 
     'xe_ctyo' => null, 
     'xe_ctyo_de' => null, 
     'xe_cean' => null, 
     'xe_ewm_dsce' => null, 
     'xe_cood' => null, 
     'xe_ewm_dsne' => null, 
     'xe_ewm_dsge' => null, 
     'xe_ewm_dsen' => null, 
     'xe_ewm_dscz' => null, 
     'xe_wgh1' => null, 
     'xe_wgh2' => null, 
     'xe_wgh3' => null 
    ] 

In meinem Controller-habe ich diese Zeilen

foreach ($articles AS $article) { 
    $query = $this->Articles->query(); 
    $query 
     ->insert($required_article_fields) 
     ->values($article) 
     ->execute(); 
} 

Dieser Code funktioniert gut, aber hat jemand für mich einen Vorschlag, wie man einen Einsatz auf doppelten Schlüssel zu tun aktualisieren? Und wie empfiehlt es sich, viele Datenzeilen gleichzeitig zu speichern?

Antwort

15

können Sie die Methode Abfrage epilog()

foreach ($articles AS $article) { 
    $query = $this->Articles->query(); 
    $query 
    ->insert($required_article_fields) 
    ->values($article) 
    ->epilog('ON DUPLICATE KEY UPDATE field=field+1') 
    ->execute(); 
} 

Sie können ein Queryexpression-Objekt übergeben das Verfahren auch verwenden, wenn Sie sicher Werte müssen passieren.

4

wie von https://stackoverflow.com/a/26590483/80353

können Sie tun

$query = $this->Articles->query(); 
$query->insert($required_article_fields); 


// need to run clause('values') AFTER insert() 
$valuesExpression = $query->clause('values')->values($articles); 

$query->values($valuesExpression) 
     ->epilog('ON DUPLICATE KEY UPDATE `field1`=VALUES(`field1`) ... ') 
     ->execute(); 

ich nicht in allen Feldern zu füllen haben Sie aktualisieren möchten, weil ich nicht weiß, welche Feld Teil Ihres eindeutigen Index ist.