如何使用Laravel的Eloquent/Fluent将每一行设置为相同的值?

Pet*_*ete 39 fluent laravel eloquent laravel-3

我需要更新所有行的一个数据库,以便在某一领域的所有他们等于单个值.这是一个例子.

假设我的数据库表是这样的:

id    |   data   |  confirmed
1     | someData |      0
2     | someData |      1
3     | someData |      0
Run Code Online (Sandbox Code Playgroud)

我想执行一个查询,将每行的确认字段设置为1.

我可以这样做:

$rows = MyModel::where('confirmed', '=', '0')->get();
foreach($rows as $row) {
    $row->confirmed = 0;
    $row->save();
}
Run Code Online (Sandbox Code Playgroud)

但似乎会有更好的方法吗?单个查询只会说"将每行'确认'字段设置为1".

Laravel的Eloquent/Fluent中是否存在这样的查询?

LHo*_*man 72

嗯,一个简单的答案:不,你不能用口才.模型表示数据库中的1行,如果他们实现了这一行就没有意义.

但是,有一种方法可以用流利的方式做到这一点:

$affected = DB::table('table')->update(array('confirmed' => 1));
Run Code Online (Sandbox Code Playgroud)

甚至更好

$affected = DB::table('table')->where('confirmed', '=', 0)->update(array('confirmed' => 1));
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,但 Matt 的新答案是更干净的方法,因为该答案使用 Eloquent,因此您不必依赖于了解表名称并诉诸数据库构建器函数。 (2认同)

Mat*_*att 66

只是为了保持此线程的最新状态,您可以使用以下命令直接针对Eloquent模型更新所有行:

Model::query()->update(['confirmed' => 1]);
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用 Eloquent。这一定是答案 (7认同)
  • 这就是我要找的!谢谢! (3认同)
  • 这是最好的方法。只是为了为 `query()` 部分添加一些解释,如果您正在执行类似 `Model::where('foo', '=', 'bar')->update(['confirmed' => 1] 的操作)` 你不需要 `query()` 部分。但是要在没有“where()”的情况下更新所有行,需要“query()”来获取查询构建器对象。 (3认同)
  • 请注意,这与“DB::table('table')”不同,因为它不考虑软删除行!为此,您可以使用:`Model::query()->withTrashed()->update(['confirmed' => 1]);` (2认同)

小智 19

你可以用elquent(laravel 4)做到这一点:

MyModel::where('confirmed', '=', 0)->update(['confirmed' => 1])
Run Code Online (Sandbox Code Playgroud)