Laravel:使用一个查询更新行

Laravel:使用一个查询更新行,laravel,eloquent,Laravel,Eloquent,我的表中有title和slug字段,其中slug=null。现在,我如何使用facadeStr::slug($title)编写slug字段titleslug,当然,如果可能的话,只需一个查询 我可以通过对数据库的许多查询来循环: foreach ($posts as $post) { $post->update(['slug' => Str::slug($post->title)]); } 但我如何通过一个查询来完成类似的操作: Post::all()->upd

我的表中有
title
slug
字段,其中
slug
=
null
。现在,我如何使用facade
Str::slug($title)
编写
slug
字段
title
slug,当然,如果可能的话,只需一个查询

我可以通过对数据库的许多查询来循环:

foreach ($posts as $post) {
    $post->update(['slug' => Str::slug($post->title)]);
}
但我如何通过一个查询来完成类似的操作:

Post::all()->update(['slug' => Str::slug($this->title)]);

也许可以通过向collection
all()
方法中添加
callback
来实现这一点?

我认为您想要做的是不可能的,因为方法
all()
返回一个集合,并且没有与该集合关联的此类方法更新


尽管您可以在控制器中创建一个方法来执行您提到的foreach,并将代码变得更干净。

只要它们的值相同,您就可以这样做

Post::query()->update(['slug' => Str::slug($this->title)]);
你可以跟我核对一下

DB::enableQueryLog();
Post::query()->update(['slug' => Str::slug($this->title)]);
$log = DB::getQueryLog();
dd($log);

它不适用于
all()
,但是你可以使用
,其中
看到:缺少a[但这应该可以工作。正确的语法:
Post::query()->update(['slug'=>Str::slug($this->title)];
@BramVerstraten很好。当我复制他的代码时,我一定删除了第一个[。更新了我的答案。