2014-07-20 2 views
6

J'ai un tableau $articles comme celui-ciCakePHP 3.0: Comment faire une insertion sur une mise à jour de clé en double?

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

Dans mon contrôleur je ces lignes

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

Ce code fonctionne très bien, mais quelqu'un at-il une suggestion pour moi comment faire un encart sur clé en double mettre à jour? Et quelle est la meilleure pratique pour enregistrer plusieurs lignes de données à la fois?

Répondre

15

Vous pouvez utiliser la méthode de requête 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(); 
} 

vous pouvez également passer un objet QueryExpression à la méthode si vous devez passer en toute sécurité les valeurs.

4

Comme suggéré par https://stackoverflow.com/a/26590483/80353

vous pouvez faire

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

Je n'ai pas rempli tous les champs que vous souhaitez mettre à jour parce que je ne sais pas quel domaine fait partie de votre index unique.

Questions connexes