更新具有多行的模型

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

【讨论】:

以上是关于更新具有多行的模型的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在一个查询中更新具有不同值的多行

一次更新 ORM 模型中的多行

BigQuery 更新在具有多行的表上合并

如何在mysql中更新具有相同值的多行[关闭]

在具有不同值的多行上更新同一列

SQL:如果存在则更新,否则插入...但对于具有不同值的多行