【问题标题】:How Eloquent ORM creates its data structure on eager loadingEloquent ORM 如何在预加载时创建其数据结构
【发布时间】:2016-12-08 06:52:32
【问题描述】:

我一直在研究 eloquent 的源代码,以了解它在预先加载指定的一个或多个关系时如何管理构建其数据结构,但我没有成功。

例如:

User has many photos, and a photo belongs to a User
  1. eloquent 如何执行其 SQL 查询?
  2. 它是否生成多个 SQL?一个查询来获取用户,然后另一个查询来获取他/她的照片,或者它是否执行单个查询。

我也有兴趣查看 SQL 的结构,因为我尝试了很多选项,但我绝对无法分辨每个字段属于哪些表,因为返回的结果只是简单的对象数组。

【问题讨论】:

  • 实际上,laravel 会创建两个查询。一个用于获取用户,然后使用in (user-ids) 查询获取所有照片。然后映射在应用程序端完成。 source with,如果你进一步追踪它的调用,你最终会得到here。也尝试激活DbQueryLogs,然后查看它触发了多少查询。
  • @BagusTesa 非常感谢,我认为您的评论可能是一个答案
  • 不,几乎没有,无论如何解释 laravel 的魔力都需要很长的解释。希望有人详细说明。

标签: laravel orm eloquent


【解决方案1】:

当你尝试使用预加载时,Laravel 将创建至少两个查询。

例如这段代码:

$users = User::with('photos')->get();

将产生两个类似的查询:

select * from `users` where `users`.`deleted_at` is null
select * from `photos` where `photos`.`user_id` in ('1', '2', ... '99')

如果您想更好地了解原始 SQL 查询的外观,我建议您使用 Laravel Debugbar

有时在php artisan tinker 工具中使用toSql() 也很有帮助:

\App\User::where('id', 2)->toSql()

【讨论】:

  • >>> App\User::where('id', 2)->with('photos')->toSql() => "select * from users where id = ?"
  • 不返回完整的sql
  • 是的,但它在很多情况下都有帮助。如果您想获得实际的 SQL 查询,请使用调试栏。
猜你喜欢
  • 2020-03-14
  • 2021-04-12
  • 2021-06-05
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2013-07-19
相关资源
最近更新 更多