52ky 发表于 2022-5-3 12:27:17

Eloquent 模型批量更新

问题
如果我错了,请纠正我,但我认为雄辩的模型中不存在大规模更新。

有没有一种方法可以对数据库表进行大规模更新,而不必为每一行发出查询?

比如有没有静态方法
User::updateWhere(
    array('age', '<', '18'),
    array(
      'under_18' => 1
      [, ...]
    )
);
(是的,这是一个愚蠢的例子,但你明白了......)

为什么没有实现这样的功能?

如果发生这样的事情,只有我会高兴吗?

我(开发人员)不想像这样实现它:

DB::table(&amp;#39;users&amp;#39;)->where(&amp;#39;age&amp;#39;, &amp;#39;<&amp;#39;, &amp;#39;18&amp;#39;)-&amp;gt ;update(array(&amp;#39;under_18&amp;#39;=>1));

因为随着项目的发展,以后我们可能需要程序员更改表名,而他们无法搜索和替换表名!

有没有这样的静态方法来做到这一点?如果没有,我们可以扩展 Illuminate\Database\Eloquent\Model 类来完成这样的任务吗?

回答
对于批量更新/插入功能,它被要求,但 Taylor Otwell(Laravel 作者)建议用户应该使用 Query Builder。 https://github.com/laravel/framework/issues/1295

您的模型通常应该扩展 Illuminate\Database\elloquent\Model。然后访问实体本身,例如,如果您有:
<?php
Use Illuminate\Database\Eloquent\Model;

class User extends Model {

    // table name defaults to "users" anyway, so this definition is only for
    // demonstration on how you can set a custom one
    protected $table = 'users';
    // ... code omited ...
更新#2

您必须求助于查询生成器。为了解决表命名问题,可以通过get table()方法动态获取。唯一的限制是在使用此函数之前需要初始化用户类。您的问题如下:
$userTable = (new User())->getTable();
DB::table($userTable)->where('age', '<', 18)->update(array('under_18' => 1));
这样,您的表名就是用户模型中的控制器(如上例所示)。

更新#1

另一种方法(在您的情况下效率不高)是:
$users = User::where('age', '<', 18)->get();
foreach ($users as $user) {
    $user->field = value;
    $user->save();
}
这样,表名保存在 users 类中,开发人员不必担心。



页: [1]
查看完整版本: Eloquent 模型批量更新