如何通过 Laravel 5.2 中的多态关系检索孙子?
How to retrieve grandchildren through a polymorphic relation in Laravel 5.2?
我的数据库设计如下图所示。
一门课程有很多模块
模块变形为 Scorm 和其他 2 个表(本例中未使用)
一个 scorm 变形一个模块并且有许多 scoes
我正在尝试从我的课程模型中访问所有相关的 scoes:
$course->scoes.
我正在使用 Laravel 5.2,使用 Eloquent 关系 我知道这是不可能的。经过几次测试后,使用查询构建器我实际上可以 return 正确的数据,但是,它们作为 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');
}
我不确定,但这可能正是您想要的。
https://laravel.com/docs/5.2/eloquent-relationships#has-many-through
我找到了一种方法来完成我想做的事情。这种方式只对数据库进行 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);
}
我的数据库设计如下图所示。
一门课程有很多模块 模块变形为 Scorm 和其他 2 个表(本例中未使用) 一个 scorm 变形一个模块并且有许多 scoes 我正在尝试从我的课程模型中访问所有相关的 scoes:
$course->scoes.
我正在使用 Laravel 5.2,使用 Eloquent 关系 我知道这是不可能的。经过几次测试后,使用查询构建器我实际上可以 return 正确的数据,但是,它们作为 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');
}
我不确定,但这可能正是您想要的。 https://laravel.com/docs/5.2/eloquent-relationships#has-many-through
我找到了一种方法来完成我想做的事情。这种方式只对数据库进行 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);
}