我有3种型号:Conference,Session和Speaker.会议可以有很多会议,很多会议可以有很多演讲者.
conferences
-----------
id
name
sessions
--------
id
conference_id
name
session_speaker
---------------
id
session_id
speaker_id
speakers
--------
id
name
Run Code Online (Sandbox Code Playgroud)
我需要编写一种方法,让我能够得到特定会议的所有发言者(所有发言人都来自该会议的所有会议).
以下说明了我认为应该起作用的内容,但显然不能,因为我无法将这些链接在一起.
class Conference extends Eloquent {
public function speakers() {
return $this->hasMany('Session')->belongsToMany('Speaker');
}
}
Run Code Online (Sandbox Code Playgroud)
我已经建立了所有模型 - 模型关系并且工作正常(会议 - 会话,会话 - 演讲者)但是我不能在会议 - 会话 - 演讲者之间建立桥梁.有没有人知道如何在不编写大型SQL连接查询的情况下实现这一目标?
我认为,如果有关系,belongsToManyThrough()这将有效,但没有.
提前致谢!
不幸的是,hasManyThrough关系不适用于它们之间的多对多关系.
你能做的是这样的:
public function speakers() {
$session_ids = Session::where('conference_id', $this->id);
$speaker_ids = DB::table('session_speaker')->whereIn('session_id', $session_ids)->lists('speaker_id');
return Speaker::whereIn('id', $speaker_ids)->get();
}
Run Code Online (Sandbox Code Playgroud)
array(0)如果没有找到结果,您可能需要将变量设置为,否则whereIn函数将引发错误.您也可以使用Eloquent-only方式,但这可能会导致更多的数据库查询,而这一个应该没问题,只运行2个查询.
然后,您可以使用例如访问扬声器Conference::find(1)->speakers().