需要一些帮助将以下Laravel Eloquent for循环查询转换为单个MySQL查询,该查询一次性访问数据库。基本上,这将根据$ cardQueryList中的项目数量多次命中数据库。
for($i=0; $i<count($cardQueryList); $i++) {
$userCard = Collection::firstOrNew( ['username' => $cardQueryList[$i]['username'], 'card_uid' => $cardQueryList[$i]['card_uid']] );
$userCard->have_quantity = $cardQueryList[$i]['have_quantity'];
$userCard->save();
}
这就是我目前所拥有的:
DB::raw('REPLACE INTO users_collection (username, card_uid, have_quantity) values('.$cardQueryList[$i]["username"].', '.$cardQueryList[$i]["card_uid"].', '.$cardQueryList[$i]["have_quantity"].')');
问题是我使用'username'和'card_uid'作为唯一键来查找要更新的相应行。另一个问题是,这要求我为所有字段指定所有值,否则字段将丢失或替换为默认值。
如何在原始MySQL查询中使用一次而不是像Laravel Eloquent代码中的n次?或者有没有办法用Eloquent打一次数据库(这将是最好的,但我不认为有办法)?
答案 0 :(得分:0)
修改,您可以使用以下内容对DB
进行批量更新:
DB::table((new Collection)->getTable())->update([
[
'field' => 'value',
'field2' => 'value 2',
],
[
'field' => 'value',
'field2' => 'value 3',
],
])
->where('some_id', $id);
原始SQL是否真的是您正在寻找的,或者您可以简单地按照以下方式执行某些操作:
foreach ($cardQueryList as $cardQuery) {
$userCard = Collection::where('username', $cardQuery['username'])
->where('card_uid', $cardQuery['card_uid'])
->firstOrNew();
$userCard->have_quantity = $cardQuery['have_quantity'];
$userCard->save();
}
答案 1 :(得分:0)
这就是我解决它的方法。
$last = count($cardQueryList)-1;
$sql = 'INSERT INTO users_collection (username, card_uid, have_quantity) VALUES ';
for($i=0; $i<$last; $i++) {
$sql .= '("'. $cardQueryList[$i]['username'] .'", "'. $cardQueryList[$i]['card_uid'] .'", '. $cardQueryList[$i]['have_quantity'] .'), ';
}
$sql .= '("'. $cardQueryList[$last]['username'] .'", "'. $cardQueryList[$last]['card_uid'] .'", '. $cardQueryList[$last]['have_quantity'] .') ';
$sql .= 'ON DUPLICATE KEY UPDATE ';
for($i=0; $i<$last; $i++) {
$sql .= 'have_quantity = '. $cardQueryList[$i]['have_quantity'] .', ';
}
$sql .= 'have_quantity = '. $cardQueryList[$last]['have_quantity'];
DB::statement($sql);