Asked May 28th, 2023 7:53 a.m. 171 0 5
  • 171 0 5
0

Tối ưu multi update trong laravel.

Share
  • 171 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 ANSWERS


Answered 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

Share
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.

0
| Reply
Share
Avatar Michael Scofield @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

0
| Reply
Share
Answered 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)
Share
Answered 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...)
Share
Answered 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 ));

Share
Answered Dec 13th, 2023 7:57 a.m.
Share
Viblo
Let's register a Viblo Account to get more interesting posts.