laravel 4.2更新多个模型

时间:2016-04-28 10:45:27

标签: laravel laravel-4 eloquent

是否可以像这样更新多个模型:

if(count($value))
{      
   $prices = $collection->prices;
   foreach($prices as $price) {
     $price->price = $price->price * 5;
     $price->save();
   }
} 

?或者我需要做这样的事情:

SELECT a.table_name, a.column_name, a.constraint_name, c.owner, 
       -- referenced pk
       c.r_owner, c_pk.table_name r_table_name, c_pk.constraint_name r_pk
  FROM all_cons_columns a
  JOIN all_constraints c ON a.owner = c.owner
                        AND a.constraint_name = c.constraint_name
  JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
                           AND c.r_constraint_name = c_pk.constraint_name
 WHERE c.constraint_type = 'R'
   AND a.table_name :=TABLE_NAME
   AND c.owner :=OWNER_NAME;

1 个答案:

答案 0 :(得分:1)

您可以查看Illuminate\Database\Eloquent\Collectionhttps://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html

的文档

没有方法来更新集合中的所有结果,但是有一些方法可以迭代每个项目,您可以在其中执行任何操作。也许是......?

$collection->each(function($model) {
    $model->price *= 5;
    $model->save();
});

您的第二个代码示例看起来几乎正确,但该集合上没有prices属性。您只需遍历集合本身即可。这相当于上面的代码:

foreach ($collection as $model) {
    $model->price *= 5;
    $model->save();
}

如果price字段为mass assignable,则可能更具可读性:

$collection->each(function($model) {
    $model->update(['price' => $model->price * 5]);
});

最后,如果在SQL中可以执行所需的操作,则可以在查询构建器上将modelKeys()whereIn()的集合合并为一行(尽管不一定推荐):

$model->whereIn($model->getKey(), $collection->modelKeys())
      ->update(['price' => \DB::raw('price * 5')]);