Asked thg 5 28, 7:53 SA 131 0 4
  • 131 0 4
0

Tối ưu multi update trong laravel.

Share
  • 131 0 4

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 đỡ.

4 ANSWERS


Answered thg 5 28, 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

Share
Avatar LongThanh @LongThanh.it
thg 5 28, 9:47 SA

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

0
| Reply
Share
Avatar Quiet @simple1805
thg 5 28, 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

0
| Reply
Share
Answered thg 5 29, 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)
Share
Answered thg 6 3, 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...)
Share
Answered thg 6 8, 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 ));

Share
Viblo
Let's register a Viblo Account to get more interesting posts.