我这里有点问题。 不是在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只更新一行?
答案 0 :(得分:1)
我理解你正在努力实现的目标,并将自己作为一项挑战。以下代码经过测试,可以满足您的需求。它获取第一个未分配给列表中每个游戏的任何用户的免费序列。第二个查询将所选序列分配给用户。
$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]);
答案 1 :(得分:0)
您可以在不使用循环的情况下执行此操作。您可以在条件下传递游戏阵列。请尝试下面给出的代码 -
`DB::table('game_serials')
->whereNull('user_id')
->whereIn('game_id', $games)
->update([
'user_id' => 1
]);`