@kirill-93

Как правильно настроить отношения в данном случае?

Делаю что-то вроде конструктора страниц.
Есть сущность 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);
    }
  }
}


Как правильно организовать структуру для такой задачи?
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы