如何同步hasMany关系上的子表数据?
Posted
技术标签:
【中文标题】如何同步hasMany关系上的子表数据?【英文标题】:How to synchronise child table data on hasMany relationship? 【发布时间】:2020-12-08 16:20:10 【问题描述】:我有 2 个表 products
和 variants
,具有 hasMany 关系,结构如下:
产品型号:
public function variants()
return $this->hasMany(Variant::class);
变体模型:
public function product()
return $this->belongsTo(Product::class);
产品表:
| id name image manufacturer
| 1 T-Shirt t-s.jpg docomo
| 2 Short Skirt s-skirt.jpg docomo
变量表:
| id product_id name price sku quantity
| 1 1 S 30 ts-s 100
| 2 1 M 32 ts-m 100
| 3 1 XL 35 ts-xl 100
| 4 2 S 23 sk-s 100
| 5 2 M 25 sk-m 100
| 6 2 XL 28 sk-xl 100
我可以将 Product 模型中 Variant 模型(子表)的数据保存为:
public function store(Request $request)
$q = new Product;
$q->name = $request->name;
$q->save();
// Below child table
$q->variants()->createMany($request->variant);
我可以存储数据,但问题是,如何更新子表? [可以创建、更新或删除]
我尝试使用sync()
方法,但没有奏效。其为manyToMany
关系。
public function update(Request $request)
$q = Product::findOrFail($request->id);
$q->name = $request->name;
$q->save();
// Below child table update
// $q->variants()->sync($request->variant); // not worked
sync()
在manyToMany
关系中工作。 hasMany
关系我需要相同的。
我该怎么做?
【问题讨论】:
【参考方案1】:不幸的是,hasMany
关系没有 sync
方法。自己做很简单。您可以简单地删除行并重新插入它们。
public function update(Request $request, Product $product)
$product->update(['name' => $request->name]);
// Below child table update
$product->variants()->delete();
$product->variants()->sync($request->variant);
【讨论】:
不要这样做,因为将来您可能需要存储数据透视数据。 如果他需要在数据透视表中保存额外的数据,他可以简单地在同步方法中传递一个带有额外信息的数组。这不是问题,您不确定是否会添加一个功能。以上是关于如何同步hasMany关系上的子表数据?的主要内容,如果未能解决你的问题,请参考以下文章