Как получить полиморфные отношения в laravel?

У меня есть 3 модели и миграции в приложении laravel, где используются полиморфные отношения

Модели

  • Атрибут
  • AttributeValue
  • ModelHasAttribute

Миграции

Атрибут

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

AttributeValue

Schema::create('attribute_values', function (Blueprint $table) {
    $table->id();
    $table->string('value');
    $table->foreignId('attribute_id')->constrained();
    $table->uuidMorphs('model');
    $table->timestamps();
});

ModelHasAttribute

Schema::create('model_has_attributes', function (Blueprint $table) {
    $table->id();
    $table->foreignId('attribute_id')->constrained();
    $table->foreignId('attribute_value_id')->constrained();
    $table->uuidMorphs('model');
    $table->timestamps();
});

Теперь здесь все атрибуты будут созданы только с использованием модели атрибута, а значения для атрибута будут созданы с использованием всех других моделей, например, в моем случае модель категории.

Класс категории имеет такой метод отношений внутри:

public function attributeValues()
{
    return $this->morphMany(AttributeValue::class, 'model');
}

Вопрос: Как я могу получить все атрибуты с их значениями внутри модели категорий и как вы думаете, мои отношения правильные или могут быть лучше?

1 ответ

Почему не просто:

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('value');
    $table->timestamps();
    $table->unsignedBigInteger('attributable_id');
    $table->string('attributable_type');
});

Затем в модели атрибута:

class Attribute extends Model
{
    public function attributable()
    {
        return $this->morphTo();
    }
}

В модели Catgeory:

class Category extends Model
{
    public function attributes()
    {
        return $this->morphMany(Attribute::class, 'attributable');
    }
}

Редактировать:

Если вы действительно хотите иметь от одного до нескольких значений атрибутов для каждого атрибута:

В миграциях:

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
    $table->unsignedBigInteger('attributable_id');
    $table->string('attributable_type');
});

Schema::create('attribute_values', function (Blueprint $table) {
    $table->id();
    $table->string('value');
    $table->timestamps();
    $table->unsignedBigInteger('attribute_id');
    
    $table->foreign('attribute_id')
          ->references('id')
          ->on('attributes')
});

Затем в классе Attribute:

    public function values()
    {
        return $this->hasMany(AttributeValue::class);
    }

и класс AttributeValue:

class AttributeValue extend Model
{
    public function attribute()
    {
        return $this->belongsTo(Attribute:class);
    }
}

Теперь я не могу вспомнить, работает ли hasManyThrough с полиморфными отношениями, но:

class Category extends Model
{
    public function attributes()
    {
        return $this->morphMany(Attribute::class, 'attributable');
    }

    public function attributeValues()
    {
        return $this->hasManyThrough(AttributeValue::class, Attribute::class)
    }
}
Другие вопросы по тегам