0

何日も解決できなかった問題があります。私を助けてくれる人がここにいるかもしれません。

基本的な考え方

Product という名前のモデルがあります。それぞれProductが複数持つことができますProductAttributes(belongsToManyピボット付き)。

例:

Product: 車

  • ProductAttributes:
    • 馬力

のピボット テーブルにProductAttributeは、それぞれの属性の値が保持されます (色 = 青、PS = 180)。

これはすでに非常にうまく機能しています。

問題

次に、製品パッケージを実装したいと思います。商品パッケージ ( ProductBundle) には多くの商品が含まれています。ただし、これらの製品には、属性用の独自のピボット テーブルが必要です。そのため、製品バンドルでは、作成した車が実際の製品で定義されているよりも多くの PS を持っていることを指定できるようにしたいと考えています。

このために、属性用に 2 つのピボット テーブルが必要です。

私がすでに試したこと

  • ProductBundleProduct異なるピボットテーブルを使用したbelongsToMany
  • ProductBundlebelongsToMany ProductBundleProduct(実際の「基本製品」を参照する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 つの属性しか格納されないことを意味します。

4

1 に答える 1