Laravel: полиморфное отношение через две сводные таблицы - PullRequest
0 голосов
/ 05 декабря 2018

Мы создаем новую систему продуктов в среде Laravel, где у нас возникла проблема с настройкой отношений между моделями и опорными точками.Ситуация может отображаться следующим образом: Situation

Продукт может иметь определенные атрибуты, такие как, например, Цвет.Это сохраняется в таблице morph_has_attributes.Однако мы также хотели бы установить значение этого атрибута 'color'.Это можно легко сделать, имея attribute_value_id в таблице morph_has_attributes.Тем не менее, мы хотели бы иметь возможность привязать несколько значений к атрибуту, поэтому существует отношение «многие ко многим» между сводкой и значением атрибута.

Пример: я продаю автомобиль (продукт), который имеет несколько цветов (атрибут): зеленый и красный (значения).

Я обнаружил следующую статью что похоже на мою ситуацию, однако, в их случае AttributeValue имеет ключ вместо MorphHasAttributeValue.

Моя цель состоит в том, чтобы установить отношение между Product (или Search), которое похоже из-за отношения Polymorphic) и AttributeValues.

Используемые в настоящее время отношения выглядят следующим образом:

Класс продукта

class Product extends Model
{
    /**
     * Get all of the attributeTypes for the product.
     */
    public function attributeTypes()
    {
        return $this->morphToMany('App\AttributeType', 'morph', 'morph_has_attributes');
    }

    /**
     * Get all of the morphHasAttributeValues pivots for the product.
     */
    public function morphHasAttributeValues()
    {
        return $this->hasMany('App\Pivots\MorphHasAttributeValue')
            ->using('App\Pivots\MorphHasAttribute');
    }

    /**
     * The attributeValues that are bound to this product .
     */
    public function attributeValues()
    {
        // How do I do this?
    }
}

Класс MorphHasAttribute

class MorphHasAttribute extends MorphPivot
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'morph_has_attributes';

    public function products()
    {
        return $this->belongsTo('App\Product');
    }

    public function searches()
    {
        return $this->belongsTo('App\Search');
    }

    public function productHasAttributeValues()
    {
        return $this->belongsTo('App\ProductHasAttributeValue');
    }

    public function attributeValues()
    {
        return $this->belongsToMany('App\AttributeValue', 'morph_has_attribute_value');
    }
}

Класс MorphHasAttributeValue

class MorphHasAttributeValue extends Pivot
{
    public function products()
    {
        return $this->belongsToMany('App\Product')
            ->using('App\Pivots\MorphHasAttribute');
    }
}

Класс AttributeValue

class AttributeValue extends Model
{
    //
}
...