Yêu cầu May 28th, 2023 7:53 a.m. 149 0 5
  • 149 0 5
0

Tối ưu multi update trong laravel.

Chia sẻ
  • 149 0 5

Mình có 1 bảng học tập gồm ( id, diem_thi_ki1, diem_thi_ki2) đã có dữ liệu id và diem_thi_ki1. Bài toán bay giờ là cạp nhạt điểm kì 2 vào bngr trên.
mình đã có 2 mảng là $ids = (1,2,3,4,5,6,7) và $diem_thi_ki2 ( 5,6,3,2,4,6,7) là điểm thi tương ứng của các học sinh trên. bây giờ có cách nào dùng 1 cau query để cạp nhạt vfo bảng hy không ? Mình có thể dùng for và giải quyết đc bài toán rồi nhưng m nghĩ nó k tối ưu vì mỗi lần for là 1 lần gọi DB để update. Xin giúp đỡ.

Avatar Chilly @nhatnguyen123321
Dec 13th, 2023 7:56 a.m.

5 CÂU TRẢ LỜI


Đã trả lời May 28th, 2023 8:24 a.m.
0
Model::whereIn('id', $ids)->update(['diem_thi_ki2'=>$diem_thi_ki2]);

Bạn thử dùng whereIn kết hợp với hàm update xem sao 🤔

Link document: https://laravel.com/docs/10.x/collections#method-wherein

Chia sẻ
Avatar LongThanh @LongThanh.it
May 28th, 2023 9:47 a.m.

câu naỳ chỉ đúng khi điểm thi kì 2 nó giống nhau thôi.

Avatar Quiet @simple1805
May 28th, 2023 10:10 a.m.

@LongThanh.it Thế thì bạn có thể tham khảo các câu trả lời bên dưới https://github.com/laravel/ideas/issues/575

Đã trả lời May 29th, 2023 2:08 a.m.
0
  1. Dùng method upsert. Nếu trong data của bạn có id mà chưa xuất hiện trong bảng đó thì nó sẽ insert, còn nếu xuất hiện rồi thì nó sẽ update.

  2. Nếu là MySQL thì bạn có thể viết Raw SQL như phía dưới.

UPDATE `example` SET 
name = ELT(FIELD(id,2,4,5),'Mary','Nancy','Oliver') 
WHERE id IN (2,4,5)
Chia sẻ
Đã trả lời Jun 3rd, 2023 6:09 p.m.
0

Bạn tham khảo câu lệnh SQL này nhé:

UPDATE  test
SET diem_thi_ki2 = 
    CASE  
       WHEN id = 1 THEN 5
       WHEN id = 2 THEN '6
       WHEN id = 3 THEN 3
      .........
       ELSE id
       END 
WHERE   id IN (1, 2, 3...)
Chia sẻ
Đã trả lời Jun 8th, 2023 10:28 a.m.
0

// bạn vẫn cần 1 lần for để mapping 2 mảng $ids và $diem_thi_ki2, vào 1 câu lệnh CASE $case_string = 'CASE ';

foreach($ids as $key=>$id) { $case_string .= 'WHEN id='.$id.' THEN '.$diem_thi_ki2[$key].' '; }

$case_string .= ' END';

Model::whereIn('id', $ids)->update([ 'diem_thi_ki2' => DB::raw($case_string ));

Chia sẻ
Đã trả lời Dec 13th, 2023 7:57 a.m.
Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí