2016-09-23 13 views
2

私のデータベースデザインは、次の図のようになります。Laravel 5.2で多形関係を通して孫を検索するにはどうすればよいですか?

コースは モジュールは、SCORMと他の2つのテーブル(この例では使用されません) SCORMモーフ1つのモジュールにモーフィングし、多くのScoes を持っている私は私のコースモデルからのアクセスに使用して関連するすべてのscoesをしようとしている多くのモジュールを持っています:

$course->scoes.

私はこれが不可能である知っている雄弁な関係を使用して、Laravel 5.2を使用しています。いくつかのテストの後、クエリビルダを使用して実際に正しいデータを返すことができますが、Scorm、Scoの代わりにModule :: classのインスタンスとして戻ってきます。

これは私が今使っているコードです。

おかげで、

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'); 
} 

enter image description here

答えて

0

私がやろうとしていることをする方法が見つかりました。この方法では、dbに対して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); 

} 
関連する問題