【问题标题】:Eloquent update and get record back雄辩的更新并获取记录
【发布时间】:2015-06-13 22:19:42
【问题描述】:

当我通常更新记录时,我会这样做

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

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

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

这里的问题是 $result 向我返回一个布尔值而不是更新后的实例,所以我通常需要单独做的是在我需要执行相同的过滤器但这次是 get() 之后。

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

有没有一种更有效的方法来更新和在一次调用/请求数据库中获取记录?

【问题讨论】:

    标签: mysql laravel eloquent laravel-5


    【解决方案1】:

    这样就可以解决问题了

    $product = Product::where('id','76887')->first();
    
    $result = $product->update(['field' => 'value');
    
    $theUpdatedData = $product->refresh(); 
    
    return $theUpdatedData //This return the updated record 
    

    【讨论】:

      【解决方案2】:

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

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

      遗憾的是,MySQL 在语句级别上没有这样的支持。

      在所有 Laravel 数据库支持的情况下,您也可以使用存储过程来实现这一点(一次访问数据库)。

      【讨论】:

        【解决方案3】:

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

        $result = MyObject::where(...)->update(['field' => 'value');
        
        foreach ($objects as $object) {
           $object->field = 'value';
        }
        

        【讨论】:

          猜你喜欢
          • 2020-05-30
          • 1970-01-01
          • 2018-01-11
          • 2023-02-04
          • 2013-05-31
          • 1970-01-01
          • 1970-01-01
          • 2019-08-17
          • 1970-01-01
          相关资源
          最近更新 更多