Eloquent - 更新集合中的所有模型
Eloquent - Updating all models in a collection
我想在一个集合的所有模型中设置某个属性。
简而言之SQL:
UPDATE table SET att = 'foo' WHERE id in (1,2,3)
我拥有的代码:
$models = MyModel::findMany([1,2,3]);
$models->update(['att'=>'foo']);
取自here
但不起作用。我得到
Call to undefined method Illuminate\Database\Eloquent\Collection::update()
我发现它的唯一方法是使用查询生成器构建查询,但我宁愿避免这样做。
您正在 return 收集,而不是保持查询打开以进行更新。就像你的例子一样。
$models = MyModel::whereIn('id',[1,2,3]);
$models->update(['att'=>'foo']);
whereIn
将查询您的案例中的列 id
,第二个参数是您要 return 的 id 数组,但不会执行查询。您正在使用的 findMany
正在执行它,因此 return 正在收集模型。
如果您需要将模型用于其他用途,您可以 $collection = $models->get();
并且它将 return 模型的集合。
如果你不只是像这样简单地写在一行上;
MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);
我不推荐的另一个选项是使用以下选项;
$models = MyModel::findMany([1,2,3]);
$models->each(function ($item){
$item->update(['att'=>'foo']);
});
这将遍历集合中的所有项目并单独更新它们。但我推荐whereIn
方法。
单个查询中的最佳解决方案仍然是:
MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);
如果您已经有 collection 个模型并且想要直接更新,您可以使用 modelKeys()
方法。考虑到进行此更新后,您的 $models
collection 仍然过时,您可能需要刷新它:
MyModel::whereIn('id', $models->modelKeys())->update(['att'=>'foo']);
$models = MyModel::findMany($models->modelKeys());
我不会推荐下一个示例,因为对于您的 $models
collection 的每个项目,都会执行一个新的额外查询:
$models->each(function ($item) {
$item->update(['att'=>'foo']);
});
或更简单,从 Laravel 5.4 你可以做到 $models->each->update(['att'=>'foo']);
但是,最后一个示例(也是最后一个)在您想要触发某些模型事件时非常有用,例如 saving
、saved
、updating
、updated
.其他提出的解决方案直接接触数据库,但模型没有被唤醒。
只需使用以下内容:
MyModel::query()->update([
"att" => "foo"
]);
我想在一个集合的所有模型中设置某个属性。
简而言之SQL:
UPDATE table SET att = 'foo' WHERE id in (1,2,3)
我拥有的代码:
$models = MyModel::findMany([1,2,3]);
$models->update(['att'=>'foo']);
取自here
但不起作用。我得到
Call to undefined method Illuminate\Database\Eloquent\Collection::update()
我发现它的唯一方法是使用查询生成器构建查询,但我宁愿避免这样做。
您正在 return 收集,而不是保持查询打开以进行更新。就像你的例子一样。
$models = MyModel::whereIn('id',[1,2,3]);
$models->update(['att'=>'foo']);
whereIn
将查询您的案例中的列 id
,第二个参数是您要 return 的 id 数组,但不会执行查询。您正在使用的 findMany
正在执行它,因此 return 正在收集模型。
如果您需要将模型用于其他用途,您可以 $collection = $models->get();
并且它将 return 模型的集合。
如果你不只是像这样简单地写在一行上;
MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);
我不推荐的另一个选项是使用以下选项;
$models = MyModel::findMany([1,2,3]);
$models->each(function ($item){
$item->update(['att'=>'foo']);
});
这将遍历集合中的所有项目并单独更新它们。但我推荐whereIn
方法。
单个查询中的最佳解决方案仍然是:
MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);
如果您已经有 collection 个模型并且想要直接更新,您可以使用 modelKeys()
方法。考虑到进行此更新后,您的 $models
collection 仍然过时,您可能需要刷新它:
MyModel::whereIn('id', $models->modelKeys())->update(['att'=>'foo']);
$models = MyModel::findMany($models->modelKeys());
我不会推荐下一个示例,因为对于您的 $models
collection 的每个项目,都会执行一个新的额外查询:
$models->each(function ($item) {
$item->update(['att'=>'foo']);
});
或更简单,从 Laravel 5.4 你可以做到 $models->each->update(['att'=>'foo']);
但是,最后一个示例(也是最后一个)在您想要触发某些模型事件时非常有用,例如 saving
、saved
、updating
、updated
.其他提出的解决方案直接接触数据库,但模型没有被唤醒。
只需使用以下内容:
MyModel::query()->update([
"att" => "foo"
]);