Laravel Отношение с типом переменной «Модель», объединенное в одно отношение - PullRequest
0 голосов
/ 12 апреля 2020

Мне нужна следующая настройка:

  • Course
  • -> hasMany "Chapters"
  • ----> hasMany "Modules "

Пока все хорошо, если бы это было , что легко. Но так называемый «Модуль» может быть:

  • Lesson::class или
  • Quiz::class

, и / или модели должны быть в особом порядке, поэтому может быть так:

  1. Lesson Как купить получатели
  2. Lesson Как приготовить блины
  3. Quiz Знаете ли вы получение блина?
  4. Lesson Как подать на ужин
  5. Lesson Как правильно держать вилку и нож
  6. Quiz Делать ты умеешь есть блин?

Так что мне вообще нужны отношения:

class Course {
  public function items() {
    // now there comes pseudo code
    return hasMany Lesson::class AND/OR Quiz::class -> orderBy('position')
  }
}

но КАК: grin: .... я совершенно потерян как сделать "создать" архитектуру, как получить модели и т. д. c.

1 Ответ

0 голосов
/ 12 апреля 2020

Вам нужны отношения полиморф c. Отношения, которые могут быть превращены в урок или викторину. https://laravel.com/docs/7.x/eloquent-relationships#one -to-many-polymorphi c -отношения

courses
   id - int
   title - string
   module_id - int 
   module_type - string

lessons
   id - int
   title - int

quiz
   id - int
   title - int

Вам понадобится только один вызов отношения modules(), который можно определить следующим образом

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

Так что, позвонив по номеру Course::find(1)->modules, вы получите коллекцию уроков и викторин. Классы хранятся в поле module_type, а идентификатор - в module_id, поэтому Laravel будет знать, к какому классу следует преобразовать запись.

...