Noticias de Famosos

đã thích câu trả lời

Bạn có thể tham khảo qua cách sử dụng cú pháp CASE trong SQL. Với yêu cầu bài toán của bạn thì thử cách sau nhé. Tuy nhiên khi số lượng bản ghi của bảng products quá lớn, bạn nên tách ra thành từng phần như khoảng 1000, 2000 id để update.

$cases = [];
$ids = [];
$params = [];

foreach ($updateData as $id => $value) {
    $id = (int)$id;
    $cases[] = "WHEN {$id} then ?";
    $params[] = $value;
    $ids[] = $id;
}

$ids = implode(',', $ids);
$cases = implode(' ', $cases);
$now = \Carbon\Carbon::now(); //ví dụ là 2019-06-08 09:47:38

DB::update("UPDATE `products` SET `view_count` = CASE `id` {$cases} END, `updated_at` = \"{$now}\" WHERE `id` in ({$ids})", $params);

Query từ câu lệnh trên sẽ tương đương với câu SQL như sau:

"UPDATE `products` SET `view_count` = CASE `id` WHEN 1 then ? WHEN 2 then ? WHEN 3 then ? WHEN 4 then ? WHEN 5 then ? END, `updated_at` = "2019-06-08 09:47:38" WHERE `id` in (1,2,3,4,5)"

Với dữ liệu ví dụ bạn đưa ra, câu SQL với params được truyền vào cụ thể sẽ là:

"UPDATE `products` SET `view_count` = CASE `id` WHEN 1 then 20 WHEN 2 then 35 WHEN 3 then 60 WHEN 4 then 82 WHEN 5 then 350 END, `updated_at` = "2019-06-08 09:47:38" WHERE `id` in (1,2,3,4,5)"