принадлежит toMany withPivot, который принадлежит другому элементу с pivot - PullRequest
0 голосов
/ 21 октября 2019

У меня есть проблема, которую я не смог решить за несколько дней. Может быть, здесь есть кто-то, кто может мне помочь.

Основная идея

У меня есть модель с именем Product. Каждый Product может иметь несколько ProductAttributes (belongsToMany с поворотом).

Пример:

Product: автомобиль

  • ProductAttributes:
    • Цвет
    • HORSEPOWER

Сводная таблица для ProductAttribute содержит значения для соответствующих атрибутов (color = blue, PS =180).

Это уже работает очень хорошо.

Проблема

Теперь я хочу реализовать пакеты продуктов. Упаковка продукта (ProductBundle) имеет много продуктов. Но эти продукты должны иметь свои собственные сводные таблицы для своих атрибутов. Поэтому в комплекте продуктов я хочу указать, что созданный мной автомобиль имеет больше PS, чем определено в реальном продукте.

Для этого мне нужны 2 сводные таблицы для атрибутов.

То, что я уже пробовал

  • ProductBundle ownToMany Product с использованием другой сводной таблицы
  • ProductBundle ownToMany ProductBundleProduct (* ProductBundleProduct имеет поле с именем product_id, который относится к фактическому «базовому продукту»)

В обоих сценариях у меня проблема в том, что сводная таблица для атрибутов продукта, принадлежащего к пакету продукта, не сохраняется правильно:

Product

    /**
     * @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 Ответ

0 голосов
/ 21 октября 2019

Вы можете иметь дополнительный столбец в сводной таблице между Product и ProductAttributes, скажем, product_bundle_id. Таким образом, вы можете получить атрибуты для определенного пакета или базовые атрибуты с product_bundle_id как 0

Посмотрите на Saving Additional Data On A Pivot Table в Laravel Eloquent, от многих ко многим

...