在Laravel中如何将多个数组数据存入products和colors两个关联表
问题解决方法
问题原因
- 前端表单提交的
color_name、color_code为数组格式,支持多组颜色数据上传 - 现有控制器仅实例化一次Color模型,无法批量插入多条颜色数据
- 代码存在取值错误:颜色字段值应从请求参数
$request中获取,而非从刚创建的$product对象中读取(products表本身不存在颜色相关字段)
修复步骤
1. 配置模型关联
首先在App\Models\Product.php中添加一对多关联,关联Color模型:
public function colors() { return $this->hasMany(Color::class); }
同时确认App\Models\Color.php中已配置可批量赋值字段:
protected $fillable = ['product_id', 'color_name', 'color_code'];
2. 修改控制器存储逻辑
修改ProductController的store方法,支持批量插入多条颜色数据:
public function store(ProductRequest $request) { // 先创建产品数据 $product = Product::create([ 'title' => $request->title, 'latin' => $request->latin, 'price' => $request->price, 'discount' => $request->discount, 'coupon' => $request->coupon, 'order_product' => 0, 'body' => $request->body, 'keywords' => $request->keywords, 'descriptions' => $request->descriptions, ]); // 校验颜色参数合法性 $request->validate([ 'color_name' => 'required|array', 'color_name.*' => 'required|string', 'color_code' => 'required|array', 'color_code.*' => 'required|string', ]); // 组装颜色数据数组 $colorData = []; foreach ($request->color_name as $key => $name) { $colorData[] = [ 'color_name' => $name, 'color_code' => $request->color_code[$key] ?? '', ]; } // 批量插入关联颜色数据 $product->colors()->createMany($colorData); return redirect()->route('products.index'); }
可选优化
如果要进一步保证数据一致性,可以把产品创建和颜色插入的逻辑放到事务中执行,避免出现产品创建成功但颜色插入失败的异常情况。
内容的提问来源于stack exchange,提问作者user16277300
相关产品推荐
相关产品推荐

