Как получить полиморфные отношения в 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)
}
}