0

我有一个问题我几天都无法解决。也许这里有人可以帮助我。

基本理念

我有一个名为 Product 的模型。每个都Product可以有多个ProductAttributesbelongsToMany带有枢轴)。

例子:

Product: 车

  • ProductAttributes
    • 颜色
    • 马力

ProductAttribute用于保存各个属性的值的数据透视表(颜色 = 蓝色,PS = 180)。

这已经很有效了。

问题

现在我想实现产品包。一个产品包 ( ProductBundle) 包含许多产品。但是这些产品应该有自己的属性数据透视表。因此,在产品包中,我希望能够指定我创建的汽车的 PS 比实际产品中定义的要多。

为此,我需要 2 个属性数据透视表。

我已经尝试过的

  • ProductBundlebelongsToManyProduct使用不同的数据透视表
  • ProductBundle属于ToMany ProductBundleProductProductBundleProduct有一个称为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;
    }

不幸的是,这意味着一次只存储一个属性。

4

1 回答 1

0

Product您可以在和之间的数据透视表中添加一个列ProductAttributes,例如product_bundle_id。因此,您可以通过这种方式获取特定捆绑包的属性,或使用product_bundle_id0的基本属性

Saving Additional Data On A Pivot Table在Laravel Eloquent 中查看,多对多

于 2019-10-21T13:11:33.293 回答