首页 > 解决方案 > 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 。

它还会在循环中执行单独的查询以检索子菜单列表吗?

标签: phpmysqllaravellaravel-5.2

解决方案


Laravel 的活动记录实现不使用连接来处理它的关系(其中一些是这样,但那是用于belongsToMany需要使用数据透视表/中间表的关系)。

实际会发生的是 Eloquent 将从表中获取相关键并执行另一个查询以获取所需的关系,例如

Post有很多Comment,在 db 中有 3 个带有 ids 的帖子12并且3.

Post::with('comments')->get(); 

将导致:

查询 1

SELECT * from `posts`

查询 2

SELECT * FROM `comments` WHERE `comment`.`post_id` in ('1', '2', '3')

它将遍历第二个查询的结果并将它们与从第一个加载的模型相匹配。


如果您想查看 Laravel 应用程序正在运行哪些查询,那么我建议您安装:

除此之外,这些工具中的任何一个都会向您显示正在运行的查询。


推荐阅读