Tối ưu multi update trong laravel.
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 đỡ.
5 ANSWERS
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
câu naỳ chỉ đúng khi điểm thi kì 2 nó giống nhau thôi.
@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
-
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.
-
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)
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...)
// 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 ));