php - laravel 关系如何在内部运作?
问题描述
我对 laravel 关系感到非常惊讶,因为它给出了没有重复条目的结果,而 if 与左连接相比。例如最近我尝试自我加入有很多同一张桌子
public function parentMenu(){
return $this->hasMany(Page::class,'parent_page_id','id');
}
它返回以下结果
Array
(
[0] => Array
(
[id] => 1
[page_name] => Branch Details
[page_url] => #
[parent_page_id] => 0
[page_type] => 1
[created_at] => 2018-06-23 23:45:34
[updated_at] => 2018-06-23 23:45:34
[deleted_at] =>
[slug] => branch_detail
[parent_menu] => Array
(
[0] => Array
(
[id] => 2
[page_name] => Add Branch Detail
[page_url] => add-branch
[parent_page_id] => 1
[page_type] => 1
[created_at] => 2018-06-23 23:45:54
[updated_at] => 2018-06-23 23:45:54
[deleted_at] =>
[slug] => add_branch_detail
)
[1] => Array
(
[id] => 11
[page_name] => View Branch Detail
[page_url] => list-branch
[parent_page_id] => 1
[page_type] => 1
[created_at] => 2018-06-23 23:46:08
[updated_at] => 2018-06-23 23:46:08
[deleted_at] =>
[slug] =>
)
)
)
我也试图弄清楚查询
Array
(
[0] => Array
(
[query] => select * from `pages` where `pages`.`deleted_at` is null
[bindings] => Array
(
)
[time] => 0.82
)
[1] => Array
(
[query] => select * from `pages` where `pages`.`parent_page_id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) and `pages`.`deleted_at` is null
[bindings] => Array
(
[0] => 1
[1] => 2
[2] => 4
[3] => 5
[4] => 7
[5] => 8
[6] => 9
[7] => 10
[8] => 11
[9] => 12
)
[time] => 0.86
)
)
现在我的问题是假设如果我尝试获得相同的结果,mysql 查询将是什么。因为我想知道内部关系查询是如何工作的?它会在内部执行 forloop 还是在查询本身中会产生 result 。
它还会在循环中执行单独的查询以检索子菜单列表吗?
解决方案
Laravel 的活动记录实现不使用连接来处理它的关系(其中一些是这样,但那是用于belongsToMany
需要使用数据透视表/中间表的关系)。
实际会发生的是 Eloquent 将从表中获取相关键并执行另一个查询以获取所需的关系,例如
Post
有很多Comment
,在 db 中有 3 个带有 ids 的帖子1
,2
并且3
.
Post::with('comments')->get();
将导致:
查询 1
SELECT * from `posts`
查询 2
SELECT * FROM `comments` WHERE `comment`.`post_id` in ('1', '2', '3')
它将遍历第二个查询的结果并将它们与从第一个加载的模型相匹配。
如果您想查看 Laravel 应用程序正在运行哪些查询,那么我建议您安装:
除此之外,这些工具中的任何一个都会向您显示正在运行的查询。
推荐阅读
- html - 链接到不同页面上的特定部分
- python - 如何将矩阵形式的 txt 文件加载为浮点类型?
- javascript - javascript 多函数回调语法
- python - 对每个组进行排序后,在返回的 pandas groupby 对象中查找每年的最大 2 个值
- python - 如何在python中执行两个表之间的除法
- c++ - 包括在多个地方使用文件的守卫
- html - 如何在底部显示滚动条并将表格高度设为自动?
- r - 如何将几何添加到ggplot`s的列表列
- python-3.x - 寡妇上的 Python 3 UTF-8 错误?
- wordpress - 一个类别有 2 个不同的页面