Делаю что-то вроде конструктора страниц.
Есть сущность page (страница), на которую можно добавлять модули (Текст, Картинка, Ссылка и тп).
Завел следующие сущности:
//Страница
class Page extends Model
{
public function modules()
{
return $this->hasMany(Module::class);
}
}
//Модуль
class Module extends Model
{
protected $fillable = [
'page_id',
'type',
'order'
];
public function texts()
{
return $this->hasMany(Text::class);
}
public function links()
{
return $this->hasMany(Link::class);
}
public function images()
{
return $this->hasMany(Image::class);
}
}
//Модуль Текст
class Text extends Model
{
protected $fillable = [
'module_id',
'text'
];
}
//Модуль Ссылка
class Link extends Model
{
protected $fillable = [
'module_id',
'url',
'name',
'order'
];
}
//Модуль Картинка
class Image extends Model
{
protected $fillable = [
'module_id',
'url',
'name'
];
}
Человек создал страницу, добавил модуль определенного типа и в зависимости от типа он настраивает этот модуль.
Модуль с типом "текст" имеет только текстовое поле, модуль с типом "ссылка" имеет ссылку, название и место в очереди и тп.
Но так как модуль имеет только один тип, то отношение у него будет заполнено всегда только одно, а два других будут пустыми. Может можно как-то сделать по-другому? Например, так:
class Module extends Model
{
protected $fillable = [
'page_id',
'type',
'order'
];
public function items()
{
if ($this->type === 'text') {
return $this->hasMany(Text::class);
} else if ($this->type === 'link') {
return $this->hasMany(Link::class);
} else if ($this->type === 'image') {
return $this->hasMany(Image::class);
}
}
}
Как правильно организовать структуру для такой задачи?