php - 将复杂对象保存在 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);
}
解决方案
根据你有多少次迭代,你这样做的方式可能没问题。否则,如果你想要一个更流畅的解决方案,这里是:
$_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 将组成一个长查询并立即执行它。
推荐阅读
- r - 为什么我的条形图没有显示我的图例?
- javascript - 如何在外部浏览器而不是应用内(instagram、iPhone)中打开链接?
- python - Python - 如何检查 wordpress 网站版本
- python - Selenium登录问题到站点问题
- c# - 如何在 Datalist 的文本框中更新文本
- node.js - 如何在不中断长时间运行的请求的情况下将用户推送到另一个页面?
- java - 如何将字符串值与 uID Firebase 进行比较
- amazon-web-services - AWS:成员必须满足枚举值集:[WEB]
- angular - 无法在函数内调用 setAttribute
- javascript - jQuery - 使用本地存储和首选颜色方案切换暗模式