2014-07-20 7 views
6

Ho un allineamento $articles come questoCakePHP 3.0: come eseguire un inserimento sull'aggiornamento della chiave duplicato?

[ 
    (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 
    ] 

Nel mio controller ho queste righe

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

Questo codice funziona bene, ma qualcuno ha un suggerimento per me come fare un inserto sulla chiave duplicata aggiornare? E qual è la migliore pratica per salvare molte righe di dati contemporaneamente?

risposta

15

È possibile utilizzare la query epilog() metodo

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

si può anche passare un oggetto QueryExpression al metodo, se è necessario passare in modo sicuro valori.

4

Come suggerito da https://stackoverflow.com/a/26590483/80353

si può fare

$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(); 

non ho riempire tutti i campi che si desidera aggiornare, perché non so quale campo fa parte del vostro indice univoco.

Problemi correlati