更新具有多行的模型
Posted
技术标签:
【中文标题】更新具有多行的模型【英文标题】:Update model which having multiple rows 【发布时间】:2020-06-22 07:23:13 【问题描述】:我有一个对象模型,它有多个行,例如通过此查询获得的结果:
$cities = City::whereIn('id' , [1,2,3])->get();
我想要做的是用相同的值更新每一行而不使用each
,因为each
正在对每一行进行查询,所以在上面的查询中我将有 3 个查询。
不要这样做:
$cities->each->update(['name' => 'test']);
我想做这样的事情,因为我已经有了模型对象,但它不起作用:
$cities->update(['name' => 'test']);
相反,我必须做这样的事情才能让它发挥作用:
City::whereIn('id' , $cities->pluck('id'))->update(['Avatar' => 'test']);
我的问题是;为什么我不能用这个:
$cities->update(['name' => 'test']);
【问题讨论】:
City::whereIn('id' , [1,2,3])->update(['name' => 'test']);
我知道我可以做到这一点,但我只是通过这段代码来说明我的观点,我的对象已经构建在服务中,我将对象传递给另一个服务以执行更新方法
答案的关键在于,如果没有 Eloquent,你会怎么做?
【参考方案1】:
当您使用->get()
方法时,您得到的不是模型,而是模型的集合。
没有多行模型这样的东西。模型只有一个“行”。
【讨论】:
我知道这是一个返回的集合,但我只是想要一种方法来对返回的对象进行更新,我同意到目前为止还没有,但也许有,所以我问了我的问题 你可以使用 laravel 宏:laravel.com/docs/7.x/collections#extending-collections 或者在模型中创建静态函数来接收一个集合和一个更新数组。在该静态函数中,您可以遍历所有城市并更新它们 这个想法是不要迭代所有行,如果我想要这个我可以使用 $cities->each... 但我认为使用宏是一个好主意,所以我会认为关于它。但感谢您的帮助 ro 如果你想用一个 mysql reqyest 你必须在你的宏或静态函数中使用City::whereIn('ID' , $cities->pluck('id'))->update(['Avatar' => 'test']);
我认为您的解决方案有问题,因为您无法确定 ID or id
是您的主键,因此您需要再次考虑此解决方案【参考方案2】:
documentation 中有一个例子:
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
请参阅大规模更新部分。
因此,在您的情况下,查询必须是:
City::whereIn('id' , [1,2,3])
->update(['name' => 'test']);
【讨论】:
以上是关于更新具有多行的模型的主要内容,如果未能解决你的问题,请参考以下文章