雄辩的模型批量更新

2022-08-30 09:00:20

如果我错了,请纠正我,但我认为在雄辩的模型中没有大规模更新这样的事情。

有没有办法对数据库表进行批量更新,而无需对每行发出查询?

例如,是否有静态方法,例如

User::updateWhere(
    array('age', '<', '18'),
    array(
        'under_18' => 1 
        [, ...]
    )
);

(是的,这是一个愚蠢的例子,但你明白了...)

为什么没有实现这样的功能?如果这样的事情发生,我是唯一一个会非常高兴的人吗?

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

DB::table('users')->where('age', '<', '18')->update(array('under_18' => 1));

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

有没有这样的静态方法来执行此操作?如果没有,我们是否可以扩展类来完成这样的事情?Illuminate\Database\Eloquent\Model


答案 1

也许这在几年前是不可能的,但在最近版本的Laravel中,你绝对可以做到:

User::where('age', '<', 18)->update(['under_18' => 1]);

值得注意的是,在调用 之前需要 where 方法。update


答案 2

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

您的模型通常应扩展 Illuminate\Database\Eloquent\Model。然后,您可以访问实体 iself,例如,如果您有以下情况:

<?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

您必须求助于查询生成器。为了解决表命名问题,您可以通过getTable()方法动态获取它。这样做的唯一限制是,您需要先初始化用户类,然后才能使用此函数。您的查询将如下所示:

$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();
}

这样,表名就保存在用户类中,您的开发人员不必担心。


推荐