雄辩更新并获取记录

时间:2015-06-13 22:19:43

标签: mysql laravel eloquent laravel-5

当我经常更新记录时

$myObject->update(['field' => 'value']);

这会更新数据库和我的实例$ myObject。但有时我需要进行批量更新,所以我使用模型外观并执行

$result = MyObject::where(...)->update(['field' => 'value');

这里的问题是$ result给我发回一个布尔值而不是更新的实例,所以我通常需要单独做的就是我需要做同样的过滤器,但这次是get()。

$objects = MyObject::where(...)->get();

是否有更有效的方法来更新并获取对数据库的一次调用/请求中的记录?

3 个答案:

答案 0 :(得分:1)

恕我直言,你的方式可以说是Eloquent最有效率的。

如果您关心性能而不是使用Eloquent,那么使用PostgreSQL中的原始查询(带有RETURNING子句)或SQL Server(带有OUTPUT子句),您可以一次性返回更新的记录。

很遗憾,MySQL在声明级别上没有这样的支持。

在Laravel数据库支持的所有数据库中,您也可以使用存储过程实现此目标(一次访问数据库)。

答案 1 :(得分:1)

如果您希望使用最有效的方法,可以使用单个更新命令更新数据库,然后使用foreach循环遍历内存中的$对象并设置每个$object->field = 'value'。它不是特别优雅,但这是在速度方面做到这一点的最有效方式,因为这样您就不需要从数据库中重新获取模型。

$result = MyObject::where(...)->update(['field' => 'value');

foreach ($objects as $object) {
   $object->field = 'value';
}

答案 2 :(得分:1)

这将解决问题

$product = Product::where('id','76887')->first();

$result = $product->update(['field' => 'value');

$theUpdatedData = $product->refresh(); 

return $theUpdatedData //This return the updated record