2015-02-05 67 views
5

我想在集合的所有模型中设置特定属性。雄辩 - 更新集合中的所有模型

在普通的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() 

我发现它的建设与查询生成器的查询,但我宁愿避免这种情况的唯一途径。

+0

Eloquent是一个查询生成器,而不是一个ORM。它没有在模型实例上定义'update'。你可以自己定义它,但最后在_your_代码中你必须写'MyModel :: whereIn('id',[1,2,3]) - > update(...)'。 – 2015-02-05 17:10:19

+1

@SergiuParaschiv其实雄辩是一个ORM – lukasgeiter 2015-02-05 17:24:40

+1

只是搜索了同样的问题。 Hai〜 – JSelser 2015-10-07 16:34:00

回答

13

您正在返回一个集合,而不是保持查询更新。就像你的例子在做。

$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方法。

+0

'whereIn'方法的工作。但如果我有模型集合呢?有没有办法一次更新所有的人? – Jarry 2015-02-05 17:26:27

+0

没有没有没有经过他们每个我补充说,作为答案的结尾的选项,但我不建议这样做。 – 2015-02-05 17:27:47

+0

不,我不推荐它,这就是为什么我正在寻找替代品 – Jarry 2015-02-05 17:29:21

2

在一个单一的查询最好的解决办法仍然是:

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']);

然而,最后的例子(只在最后一)为好,当你想要触发像一些模型事件saving,saved,updating, updated。其他提出的解决方案直接触及数据库,但模型不会被唤醒。