如何使用laravel更新特定行

时间:2015-07-14 13:45:27

标签: laravel eloquent

我有一张桌子:

ID|user_id|group_id|subject |book_id|duplicate
 1| 2     |3       |history |1      |         
 2| 4     |3       |history |1      |
 3| 5     |3       |history |1      |

我希望结果表看起来像这样:

ID|user_id|group_id|subject |book_id|duplicate
 1| 2     |3       |history |1      |         
 2| 4     |3       |history |1      |1
 3| 5     |3       |history |1      |1

我希望将最低ID重复列之后的所有升序ID更新为1.请注意:ID是动态的,因此只使用->where(ID, '>', 1);不会在所有情况下都有效。

到目前为止,我有这个

$duplicates = DB::table('table')
               ->where('subject', 'history')
               ->where('book_id', 1)
             ->skip(1)->take(1)
            ->update(['duplicate' => 1]);

上面的代码不起作用,因为我得到一个如下所示的结果表:

ID|user_id|group_id|subject |book_id|duplicate
 1| 2     |3       |history |1      | 1        
 2| 4     |3       |history |1      |
 3| 5     |3       |history |1      |

2 个答案:

答案 0 :(得分:1)

使用此

DB::table('table')
->where('subject', 'history')
->where('book_id', 1)
->where('id', '>', 1)
->update(['duplicate' => 1]);

答案 1 :(得分:0)

您正在尝试将偏移应用于UPDATE查询,这不是有效的SQL(我假设查询构建器在调用skip(1)->take(1)时默默忽略您的update()调用。)

实现您正在寻找的结果的一种方法是找到应标记为非重复的所有ID(duplicate = null),然后更新每个其他相关记录。

具体书籍

$original = DB::table('table')
    ->select('id')
    ->where('subject', 'history')->where('book_id', 1)
    ->orderBy('id', 'asc')->first()->pluck('id'); // Lowest id

DB::table('table')
    ->where('subject', 'history')->where('book_id', 1)
    ->whereNot('id', $original) // All, but one
    ->update(['duplicate' => 1]);

所有图书

$originals = DB::table('table')
    // One for every combination of `subject` and `book_id`
    ->groupBy('subject', 'book_id')>orderBy('id', 'asc') 
    ->lists('id');

DB::table('table')
    ->whereNotIn('id', $originals) // All, but one for every book
    ->update(['duplicate' => 1]);

您可以进一步优化任一示例以使用子查询而不是两个单独的查询。