【问题标题】: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。是对的,单独查询效率更高。我会检查一下,谢谢。

标签: laravel eloquent laravel-8 laravel-query-builder


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 2021-06-17
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多