【问题标题】:Laravel get belongsToMany through hasManyLaravel 通过 hasMany 获取 belongsToMany
【发布时间】:2014-08-02 16:14:56
【问题描述】:

我有 3 个模型:ConferenceSessionSpeaker。一个会议可以有多个 Session,而多个 Session 可以有多个 Speaker。

数据库结构

conferences
-----------
id
name


sessions
--------
id
conference_id
name


session_speaker
---------------
id
session_id
speaker_id


speakers
--------
id
name

我需要编写一个方法,让我可以获取特定会议的所有发言人(即来自该特定会议的所有会议的所有发言人)。

以下说明了我认为应该起作用的方法,但显然不能,因为我无法将它们链接在一起。

app/models/Conference.php

class Conference extends Eloquent {

  public function speakers() {
    return $this->hasMany('Session')->belongsToMany('Speaker');
  }

}

我已设置所有模型-模型关系并正常工作(会议-会话、会话-演讲者),但是我无法在会议-会话-演讲者之间建立桥梁。有谁知道我如何在不编写大型 SQL 连接查询的情况下实现这一目标?

我认为如果有关系 belongsToManyThrough() 这会起作用,但没有。

提前致谢!

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    不幸的是,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();
    }
    

    如果没有找到结果,您可能需要将变量设置为array(0),否则 whereIn 函数会抛出错误。 您也可以使用 Eloquent-only 方式,但这可能会导致更多的数据库查询,而这应该没问题,只运行 2 个查询。

    然后您可以使用例如访问扬声器Conference::find(1)->speakers().

    2021 年的注意事项: 这个答案来自 2014 年,与 Laravel 4 有关。如今,这显然不再适用了。我鼓励你查看 Laravel 文档,也许这个问题现在可以用更好的方式解决。

    【讨论】:

    • 有些人在 Twitter 上说这也不可能,但感谢您的回复 - 我认为这是最好的情况!
    • Call to undefined method Illuminate\Database\Query\Builder::lists()
    • 这个答案大约有 7 年的历史,与 Laravel 4 有关。
    猜你喜欢
    • 2019-10-01
    • 2021-03-22
    • 2016-07-12
    • 2018-01-03
    • 2021-10-07
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多