我有一个问题我几天都无法解决。也许这里有人可以帮助我。
基本理念
我有一个名为 Product 的模型。每个都Product
可以有多个ProductAttributes
(belongsToMany
带有枢轴)。
例子:
Product
: 车
ProductAttributes
:- 颜色
- 马力
ProductAttribute
用于保存各个属性的值的数据透视表(颜色 = 蓝色,PS = 180)。
这已经很有效了。
问题
现在我想实现产品包。一个产品包 ( ProductBundle
) 包含许多产品。但是这些产品应该有自己的属性数据透视表。因此,在产品包中,我希望能够指定我创建的汽车的 PS 比实际产品中定义的要多。
为此,我需要 2 个属性数据透视表。
我已经尝试过的
ProductBundle
belongsToManyProduct
使用不同的数据透视表ProductBundle
属于ToManyProductBundleProduct
(ProductBundleProduct
有一个称为product_id
实际“基本产品”的字段)
在这两种情况下,我都有一个问题,即属于产品包的产品属性的数据透视表未正确保存:
产品
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function productBundleAttributes()
{
return $this->belongsToMany(ProductAttribute::class,
product_bundle_product_attribute')
->withPivot($this->attributefields)-> withTimestamps();
}
控制器
$prod = Product::findOrFail($product['id']);
$added = $productbundle->products()->save($prod, [
'custom' => $product['custom'],
'title' => $product['title'],
# 'factor' => $product['factor']
]);
/*Save attributes*/
$added->syncProductBundleAttributes($product['attributes']],
$productbundle->id);
同步方法
public function syncProductBundleAttributes(
array $attributes,
int $id
) {
$this->checkProductAttributesRecursively(collect($attributes)->transform(function (
$attributes
) use (
$id
) {
$attribute['product_bundle_id'] = $id;
$attribute['product_attribute_id'] = $attribute['id'];
return $attribute;
})->toArray());
$this->productBundleAttributes()->attach($this->result);
return $this->result;
}
不幸的是,这意味着一次只存储一个属性。