何日も解決できなかった問題があります。私を助けてくれる人がここにいるかもしれません。
基本的な考え方
Product という名前のモデルがあります。それぞれProduct
が複数持つことができますProductAttributes
(belongsToMany
ピボット付き)。
例:
Product
: 車
ProductAttributes
:- 色
- 馬力
のピボット テーブルにProductAttribute
は、それぞれの属性の値が保持されます (色 = 青、PS = 180)。
これはすでに非常にうまく機能しています。
問題
次に、製品パッケージを実装したいと思います。商品パッケージ ( ProductBundle
) には多くの商品が含まれています。ただし、これらの製品には、属性用の独自のピボット テーブルが必要です。そのため、製品バンドルでは、作成した車が実際の製品で定義されているよりも多くの PS を持っていることを指定できるようにしたいと考えています。
このために、属性用に 2 つのピボット テーブルが必要です。
私がすでに試したこと
ProductBundle
Product
異なるピボットテーブルを使用したbelongsToManyProductBundle
belongsToManyProductBundleProduct
(実際の「基本製品」を参照する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;
}
残念ながら、これは一度に 1 つの属性しか格納されないことを意味します。