Laravel SQL更新行由WHERE IN Group By

时间:2017-05-18 10:51:11

标签: php mysql sql laravel

我这里有点问题。 不是在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只更新一行?

2 个答案:

答案 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
]);`