如何使用 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 外观(缓存、日志、存储)

如何在 Laravel 8 中使用 srmklive/laravel-paypal v3

Laravel - 如何在本地开发中使用 https 服务 laravel 项目

如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?

如何在没有典型 laravel /login 的情况下使用 laravel sanctum