如何使用 Laravel 的 Eloquent/Fluent 将每一行设置为相同的值?
Posted
技术标签:
【中文标题】如何使用 Laravel 的 Eloquent/Fluent 将每一行设置为相同的值?【英文标题】:How to set every row to the same value with Laravel's Eloquent/Fluent? 【发布时间】:2013-03-15 09:37:09 【问题描述】:我需要更新数据库中的所有行,以便 all 中的特定字段等于单个值。这是一个例子。
假设我的数据库表是这样的:
id | data | confirmed |
---|---|---|
1 | someData | 0 |
2 | someData | 1 |
3 | someData | 0 |
我想执行一个查询,将每行的已确认字段设置为 1。
我可以这样做:
$rows = MyModel::where('confirmed', '=', '0')->get();
foreach($rows as $row)
$row->confirmed = 0;
$row->save();
但似乎有更好的方法?一个查询,只会说“将每一行的 'confirmed' 字段设置为 1。”
Laravel 的 Eloquent/Fluent 中是否存在这样的查询?
【问题讨论】:
【参考方案1】:嗯,一个简单的答案:不,你不能用雄辩的。一个模型代表数据库中的 1 行,如果他们实现这个就没有意义了。
但是,有一种方法可以使用 fluent 来做到这一点:
$affected = DB::table('table')->update(array('confirmed' => 1));
甚至更好
$affected = DB::table('table')->where('confirmed', '=', 0)->update(array('confirmed' => 1));
【讨论】:
这行得通,但是 Matt 的新答案更简洁一些,因为该答案使用 Eloquent,因此您不必依赖于知道表名并求助于数据库构建器功能。【参考方案2】:你可以用 elquent (laravel 4) 做到这一点:
MyModel::where('confirmed', '=', 0)->update(['confirmed' => 1])
【讨论】:
【参考方案3】:为了让这个线程保持最新,你可以直接使用 Eloquent 模型更新所有行:
Model::query()->update(['confirmed' => 1]);
【讨论】:
这就是我要找的!谢谢! 我更喜欢使用 Eloquent。这一定是答案 这是最好的方法。只是为query()
部分添加一些解释,如果您正在执行类似Model::where('foo', '=', 'bar')->update(['confirmed' => 1])
的操作,则不需要query()
部分。但是要更新没有where()
的所有行,需要query()
来获取查询构建器对象。
请注意,这与DB::table('table')
的不同之处在于它不考虑软删除的行!为此,您可以使用:Model::query()->withTrashed()->update(['confirmed' => 1]);
【参考方案4】:
您可以这样做来更新所有记录。
App\User::where('id', 'like', '%')->update(['confirmed' => 'string']);
【讨论】:
【参考方案5】:更新所有行的解决方案:
创建一个额外的列(如“updateAll”)并为所有列分配静态值 mysql 表中的行(如 'updateAll' = '1' )。
使用 name="forUpdateAll" 和 value="forUpdateAllValue" 添加隐藏输入字段 (只执行更新所有行的特定代码)
然后为 update(Request $request, $id) 方法添加此代码:public function update(Request $request, $id)
if($request->get('forUpdateAll') == "forUpdateAllValue")
$question = \App\YourModel::where('updateAll',$id)
->update([
'confirmed' => 1
]);
else
//other code ( update for unique record )
-
这样设置您的表单:
<form role="form" action="/examples/1" method="post">
method_field('PATCH')
csrf_field()
<input type="hidden" name="forUpdateAll" value="forUpdateAllValue">
<button type="submit" class="btn btn-primary">Submit</button>
</form>
【讨论】:
【参考方案6】:Model::where('confirmed', 0)->update(['confirmed' => 1])
【讨论】:
【参考方案7】:更新所有列文件
DB::table('your_table_name')->update(['any_column_name' => 'any value']);
【讨论】:
【参考方案8】:这对我有用:
MyModel::query()->update( ['confirmed' => 1] );
【讨论】:
以上是关于如何使用 Laravel 的 Eloquent/Fluent 将每一行设置为相同的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 外部的包中使用 Laravel 外观(缓存、日志、存储)
如何在 Laravel 8 中使用 srmklive/laravel-paypal v3
Laravel - 如何在本地开发中使用 https 服务 laravel 项目