2014-07-20 14 views
6

Tôi có một mảng $articles như thế nàyCakePHP 3.0: Cách chèn một bản cập nhật khóa trùng lặp?

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

Trong điều khiển của tôi, tôi có những dòng

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

Mã này hoạt động tốt, nhưng có ai là một gợi ý cho tôi làm thế nào để làm một chèn vào khóa trùng lặp cập nhật? Và cách tốt nhất để lưu nhiều hàng dữ liệu cùng một lúc là gì?

Trả lời

15

Bạn có thể sử dụng truy vấn epilog() phương pháp

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

bạn cũng có thể vượt qua một đối tượng QueryExpression để phương pháp này nếu bạn cần phải vượt qua giá trị một cách an toàn.

4

Theo đề nghị của https://stackoverflow.com/a/26590483/80353

bạn có thể làm

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

tôi không điền vào tất cả các lĩnh vực bạn muốn cập nhật bởi vì tôi không biết đó là lĩnh vực là một phần của chỉ số duy nhất của bạn.

Các vấn đề liên quan