一个查询中的雄辩模型关系

Posted

技术标签:

【中文标题】一个查询中的雄辩模型关系【英文标题】:Eloquent model relation in one query 【发布时间】:2021-05-02 09:02:38 【问题描述】:

我正在尝试在一个 SQL 查询中加载具有关系的模型。有可能吗?

例如,如果我编写经典的 eloquent 查询:

$user = User::find(1);
$user->hobby;

它将运行 2 个 SQL 查询:一个用于 User,另一个用于 HobbyUser 模型实例将在 relations 属性中包含爱好数据。 (同样会通过 ->with() 方法发生)

我用一个 SQL 查询最接近的方法是:

$user = User::select(['users.*', 'hobbies.*'])
   ->join('hobbies', 'hobbies.id', 'users.hobbie_id')
   ->find(1);

但问题是 Hobby 的列将在 original 属性中并与 User 属性混合而不是 relations 属性作为第一个例子。

是否可以做这样的事情,但关系数据将在 relations 属性下?

【问题讨论】:

我不清楚你的困惑!请说清楚。 我不相信使用默认的 eloquent 是可能的。您只想运行一个查询的原因是什么?跑两个有什么问题? 是否可以这样做,但关系数据将属于关系属性? 不行! 运行 2 个查询没有任何问题。在一个查询中运行这种关系会比两个查询慢,并且使用更多的内存空间。我什至建议你只在真正需要时才使用 with() 函数,这样你就只加载你真正需要的数据。 在我的项目中,我有超过 2 个模型关系。每次加载模型时我都需要它们。因此在加载模型时归结为 2 个以上的查询。我的想法是使用连接进行Global Scope 查询,以便每个模型加载都将连接查询中的关系。无论如何,我认为你回答了我关于做这样的事情的可能性的问题。谢谢你。也可能是@GertB。是对的,单独查询效率更高。我会检查一下,谢谢。 【参考方案1】:

您可以在选择中更改爱好的属性名称

    $user = User::select(['users.*', 'hobbies.name as hobby_name'])
   ->join('hobbies', 'hobbies.id', 'users.hobbie_id')
   ->find(1);

您可以在此更改关系属性名称

【讨论】:

以上是关于一个查询中的雄辩模型关系的主要内容,如果未能解决你的问题,请参考以下文章

如何从 hasManyThrough 雄辩关系返回 Laravel 中的单个模型

雄辩:定义模型和迁移中的关系之间的区别

Laravel 雄辩与查询构建器的优缺点

将原始查询添加到雄辩的关系

雄辩的查询以返回按二级关系排序的项目

雄辩的模型关系返回为空