我这里有一个小问题。 我不想在一个查询上执行此操作,而不是在 for 循环内运行 10 个查询。
我的代码现在看起来像这样:
foreach($games as $game_id){
DB::table('game_serials')
->whereNull('user_id')
->where('game_id', $game_id)
->update([
'user_id' => 1
]);
}
所以,我不想在一个查询上执行此操作,而不是为 5000 个用户运行相同的查询,这将非常慢地完成......
我尝试过做这样的事情:
DB::table('game_serials')
->whereNull('user_id')
->whereIn('game_id', $games)
->groupBy('game_id')
->limit(10)
->update([
'user_id' => 1
]);
$games 数组如下所示:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
但它仅按数组中的第一个值更新 10 行。
如何才能使其只更新数组中每个 game_id 的一行?
最佳答案
我理解您想要实现的目标,并把这作为一项挑战。下面的代码经过测试,可以满足您的要求。它会获取列表中每个游戏的第一个未分配给任何用户的免费系列。第二个查询将选定的序列分配给用户。
$serials = DB::table('game_serials')
->selectRaw('min(id) as id')
->whereNull('user_id')
->whereIn('game_id', $games)
->groupBy('game_id')
->get()
->pluck('id');
$result = DB::table('game_serials')
->whereIn('id', $serials)
->update(['user_id' => 1]);
关于php - Laravel SQL 按 WHERE IN Group By 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44045763/