当我经常更新记录时
$myObject->update(['field' => 'value']);
这会更新数据库和我的实例$ myObject。但有时我需要进行批量更新,所以我使用模型外观并执行
$result = MyObject::where(...)->update(['field' => 'value');
这里的问题是$ result给我发回一个布尔值而不是更新的实例,所以我通常需要单独做的就是我需要做同样的过滤器,但这次是get()。
$objects = MyObject::where(...)->get();
是否有更有效的方法来更新并获取对数据库的一次调用/请求中的记录?
答案 0 :(得分:1)
恕我直言,你的方式可以说是Eloquent最有效率的。
如果您关心性能而不是使用Eloquent,那么使用PostgreSQL中的原始查询(带有RETURNING
子句)或SQL Server(带有OUTPUT
子句),您可以一次性返回更新的记录。
在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