【问题标题】:Save complex object outside foreach将复杂对象保存在 foreach 之外
【发布时间】:2021-09-29 17:27:04
【问题描述】:

我正在尝试在数据库中存储一个复杂的对象。有很多关系,例如一对一和一对多。一切正常,但目前我正在 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);
    }

【问题讨论】:

  • 在提供的源中,您使用 $product 作为循环的值 THEN 作为 Product 类的新实例。所以循环的值被覆盖了。
  • 此外,现在我做了类似 $final_array = array(); toArray()); id = $item['id']; 之后最后在 foreach ObjA::insert($final_array );但问题是关系存在
  • @Armage,谢谢你的评论,我修好了!但是,我的问题不在于它不起作用!它有效,我正在寻找一种方法来进行适当的重构,以免在 for-each 循环中调用 save 方法。我需要以某种方式收集所有内容,并在 for-each 之外制作 MyClass::insert($allthedata)

标签: php laravel eloquent laravel-8 eloquent-relationship


【解决方案1】:

根据您的迭代次数,您可能会采用这种方式。否则,如果您想要更流畅的解决方案,这里是:

 $_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 将组成一个长查询并立即执行它。

【讨论】:

  • 你的意思是:插入($products),不是吗?
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多