首页 > 解决方案 > 将复杂对象保存在 foreach 之外

问题描述

我正在尝试在数据库中存储一个复杂的对象。有很多关系,例如一对一和一对多。一切正常,但目前我正在 foreach 循环内进行保存,这是不正确的。


foreach($list as $item){

$objA = new ObjA();
$objA->id = $item['id'];
$objA->save();

$objB = new ObjB();
$objB->name = $item['key']['name'];

$objA->extra()->save($objB);

foreach ($item['data']['products'] as $pr) {
    $product = new Product();
    $product->name = $pr['name'];
    $objA->products()->save($product);
}

}

这是代码 atm,但我需要在 foreach 之外执行查询。我怎样才能做到这一点?产品和额外的方法是这样的:

    public function extra(){
        return $this->hasOne(ObjB::class);
    }

标签: phplaraveleloquentlaravel-8eloquent-relationship

解决方案


根据你有多少次迭代,你这样做的方式可能没问题。否则,如果你想要一个更流畅的解决方案,这里是:

 $_products = [];
    foreach ($item['data']['products'] as $index=>$product) {
        $_products[$index]['name'] = $product['name'];
//      $product = new Product();
//      $product->name = $product['name'];
//      $objA->products()->save($product);
    }
 
 $objA->products()->insert($data);

这是一个“批量插入”。这意味着您在一个数组中收集了许多数据数组,将其传递给 insert,Eloquent 将组成一个长查询并立即执行它。


推荐阅读