Yêu cầu thg 5 28, 2023 7:53 SA 148 0 5
  • 148 0 5
0

Tối ưu multi update trong laravel.

Chia sẻ
  • 148 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
thg 12 13, 2023 7:56 SA

5 CÂU TRẢ LỜI


Đã trả lời thg 5 28, 2023 8:24 SA
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
thg 5 28, 2023 9:47 SA

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

Avatar Quiet @simple1805
thg 5 28, 2023 10:10 SA

@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 thg 5 29, 2023 2:08 SA
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 thg 6 3, 2023 6:09 CH
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 thg 6 8, 2023 10:28 SA
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 thg 12 13, 2023 7:57 SA
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í