laravel Eloquent -更新集合中的所有模型

chhqkbe1  于 2023-01-27  发布在  其他
关注(0)|答案(4)|浏览(155)

我想在一个集合的所有模型中设置某个属性。
在普通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()

我发现它的唯一方法是用查询构建器构建查询,但我宁愿避免这种情况。

t9aqgxwy

t9aqgxwy1#

您正在返回一个集合,而不是保持查询打开以进行更新。就像您的示例所做的那样。

$models = MyModel::whereIn('id',[1,2,3]);
$models->update(['att'=>'foo']);

whereIn将在您的案例id中查询一列,第二个参数是您要返回的id数组,但不会执行查询。您使用的findMany正在执行它,因此返回模型集合。
如果你需要把模型用于其他用途,你可以执行$collection = $models->get();,它将返回模型的集合。
如果你不只是简单地写在一行像这样;

MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);

我不推荐的另一个选项是使用以下内容;

$models = MyModel::findMany([1,2,3]);

$models->each(function ($item){
    $item->update(['att'=>'foo']);
});

这将在集合中的所有项上循环并单独更新它们。但我推荐使用whereIn方法。

sirbozc5

sirbozc52#

单个查询中的最佳解决方案仍然是:

MyModel::whereIn('id',[1,2,3])->update(['att'=>'foo']);

如果您已经有一个模型集合,并且想要进行直接更新,则可以使用modelKeys()方法。请考虑在进行此更新后,您的$models集合仍然过期,您可能需要刷新它:

MyModel::whereIn('id', $models->modelKeys())->update(['att'=>'foo']);
$models = MyModel::findMany($models->modelKeys());

我不推荐下一个示例,因为对于$models集合中的每一项,都要执行一个新的额外查询:

$models->each(function ($item) {
    $item->update(['att'=>'foo']);
});

或者更简单,在Laravel 5.4中,您可以执行$models->each->update(['att'=>'foo']);
然而,最后一个例子(也只有最后一个例子)适合触发一些模型事件,如savingsavedupdatingupdated

8ftvxx2r

8ftvxx2r3#

只需使用以下命令:

MyModel::query()->update([
    "att" => "foo"
]);
jgovgodb

jgovgodb4#

请注意,批量更新模型不会触发回调updatingupdated事件,如果需要触发这些事件,则必须单独执行每个更新,例如如下所示(假设$models是模型的集合):

$models->each(fn($model) => $model->update(['att'=>'foo']) );

相关问题