Eloquent hasManyThrough 也获取中间表信息

Posted

技术标签:

【中文标题】Eloquent hasManyThrough 也获取中间表信息【英文标题】:Eloquent hasManyThrough also get middle table information 【发布时间】:2019-10-04 11:34:04 【问题描述】:

我的表结构与 laravel 文档中提到的 HasManyThrough 关系 hasManyThrough 中的表结构相同

countries
  id - integer
  name - string 

users
  id - integer
  country_id - integer
  name - string

posts
  id - integer
  user_id - integer
  title - string

并定义与文档中相同的关系。

public function posts()

    return $this->hasManyThrough(
        'App\Post', 'App\User',
        'country_id', 'user_id', 'id'
    );

现在当我列出特定国家的帖子时。我也需要帖子用户的信息。我的意思是来自数据透视表(用户)的信息

$posts = Country::find(2)->posts();

以上仅返回帖子数据..

【问题讨论】:

【参考方案1】:

试试这个:

$posts = Country::find(2)->posts()->with('user')->get();

【讨论】:

【参考方案2】:

您需要在帖子旁边预先加载用户,可以通过 Builder 上的 with() 方法实现:

$posts = Country::find(2)->posts()->with('user')->get();

如果您要加载大量数据并且不想加载整个 User 实例,您甚至可以指定仅从 users 表中检索哪些字段:

$posts = Country::find(2)->posts()->with('user:id,name')->get();

然后您可以简单地使用$post->user->name 或迭代您的集合时需要的任何内容。

有关更多信息,请参阅documentation。

【讨论】:

对于急切加载,我需要定义帖子和用户权限之间的关系...?或者它将与我当前定义的 hasManyThrough 关系一起使用? 您必须在Post 模型中定义关系,但我认为这是值得的。您以后可能还需要这种关系,它不会过时,因为它无论如何都存在。 :) 谢谢...它的工作..我只是坚持使用 hasManyThrough 关系来寻找出路。并没有考虑其他关系拍照.. 需要更多帮助。这给了我错误。 Country::find(2)->posts()->with('user:id,name')->get(); insted of id 我的列名是 id_user 这只是一个示例,当然,如果与您的列名匹配,您必须将id 更改为user_id

以上是关于Eloquent hasManyThrough 也获取中间表信息的主要内容,如果未能解决你的问题,请参考以下文章

拉拉维尔 |使用 Eloquent hasManyThrough

Eloquent hasManyThrough a belongsTo 关系?

Laravel + Eloquent ORM: HasManyThrough OrderBy TableC.column2

如何使用 eloquent hasmanythrough 或 hasonethrough 在 laravel 中加入 3 个表

查询关系 Laravel Eloquent ORM

Laravel Eloquent - 相当于第一个()?