首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >雄辩的模型批量更新

雄辩的模型批量更新
EN

Stack Overflow用户
提问于 2014-03-16 06:43:22
回答 5查看 120.8K关注 0票数 60

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

有没有一种方法可以在不对每一行发出查询的情况下对DB表进行大量更新?

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

代码语言:javascript
复制
User::updateWhere(
    array('age', '<', '18'),
    array(
        'under_18' => 1 
        [, ...]
    )
);

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

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

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

代码语言:javascript
复制
DB::table('users')->where('age', '<', '18')->update(array('under_18' => 1));

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

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

EN

回答 5

Stack Overflow用户

发布于 2017-02-18 16:10:12

这在几年前可能是不可能的,但在最近的Laravel版本中,您肯定可以做到:

代码语言:javascript
复制
User::where('age', '<', 18)->update(['under_18' => 1]);

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

票数 101
EN

Stack Overflow用户

发布于 2019-02-07 17:29:12

对@metamaker的回答稍作更正:

代码语言:javascript
复制
DB::beginTransaction();
     // do all your updates here
        foreach ($users as $user) {
            $new_value = rand(1,10) // use your own criteria
            DB::table('users')
               ->where('id', '=', $user->id)
               ->update(['status' => $new_value  // update your field(s) here
                ]);
        }
    // when done commit
DB::commit();

现在,您可以在一个数据库事务中拥有一百万个不同的更新

票数 16
EN

Stack Overflow用户

发布于 2017-08-28 05:41:20

使用数据库事务批量更新多个实体。事务将在更新函数完成时提交,或者在两者之间发生异常时回滚。

https://laravel.com/docs/5.4/database#database-transactions

例如,下面是我在一次批量更新中重新生成项目的物化路径段(https://communities.bmc.com/docs/DOC-9902)的方法:

代码语言:javascript
复制
public function regenerateDescendantsSlugs(Model $parent, $old_parent_slug)
    {
        $children = $parent->where('full_slug', 'like', "%/$old_parent_slug/%")->get();

        \DB::transaction(function () use ($children, $parent, $old_parent_slug) {
            /** @var Model $child */
            foreach ($children as $child) {
                $new_full_slug  = $this->regenerateSlug($parent, $child);
                $new_full_title = $this->regenerateTitle($parent, $child);

                \DB::table($parent->getTable())
                    ->where('full_slug', '=', $child->full_slug)
                    ->update([
                        'full_slug' => $new_full_slug,
                        'full_title' => $new_full_title,
                    ]);
            }
        });
    }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22430716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档