Как получить внуков через полиморфное отношение в Laravel 5.2?

Мой дизайн базы данных выглядит так, как показано на диаграмме ниже.

Курс имеет много модулей. Модули преобразуются в Scorm и другие 2 таблицы (не используются в этом примере). Scorm преобразует один модуль и имеет много Scoes. Я пытаюсь получить доступ из моей модели курса ко всем связанным Scoes, используя:

$course->scoes.

Я использую Laravel 5.2, используя отношения Eloquent, я знаю, что это невозможно. После нескольких тестов с помощью построителя запросов я действительно могу вернуть правильные данные, но они возвращаются как экземпляр Module::class вместо Scorm и Sco.

Это код, который у меня есть сейчас.

Спасибо,

public function modules() {
    return $this->hasMany(Module::class);
}

public function scorms(){
    return $this->modules()->where('moduleable_type','=','scorms');
}
public function scoes(){
    return $this->scorms()->select('scoes.*')
        ->join('scoes','modules.moduleable_id','=','scoes.scorm_id');
}

введите здесь описание изображения


person Leonardo Beal    schedule 23.09.2016    source источник


Ответы (2)


Я не уверен, но это может быть именно то, что вы хотите. https://laravel.com/docs/5.2/eloquent-relationships#has-many-through

person Satisfier    schedule 26.09.2016
comment
спасибо за ваш ответ Satisfier. Это подошло бы, если бы у меня не было этого полиморфного отношения. :) - person Leonardo Beal; 26.09.2016

Я нашел способ сделать то, что я пытался сделать. Этот способ делает только 2 запроса к базе данных, и он находится в модели Sco.

//returns a Course Object.
$sco->course()

/**
* Get the course
* @return App\Course|null
*/
public function Course(){
   $o = $this
        ->join('scorms','scoes.scorm_id','=','scorms.id')
        ->join('modules',function($join){
            $join
                ->on('moduleable_id','=','scorms.id')
                ->where('moduleable_type','=','scorms');
        })
        ->join('courses','modules.course_id','=','courses.id')
        ->select('courses.id as course_id')
        ->first();

    if(!$o) return null;

    return Course::find($o->course_id);

}
person Leonardo Beal    schedule 17.10.2016