laravel关系在内部是如何工作的?

8i9zcol2  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(485)

我真的对laravel关系感到惊讶,因为它给出的结果没有重复的条目,而如果与左连接比较的话。例如,最近我尝试了self-join,将多个连接到同一个表

  1. public function parentMenu(){
  2. return $this->hasMany(Page::class,'parent_page_id','id');
  3. }

并返回以下结果

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [page_name] => Branch Details
  7. [page_url] => #
  8. [parent_page_id] => 0
  9. [page_type] => 1
  10. [created_at] => 2018-06-23 23:45:34
  11. [updated_at] => 2018-06-23 23:45:34
  12. [deleted_at] =>
  13. [slug] => branch_detail
  14. [parent_menu] => Array
  15. (
  16. [0] => Array
  17. (
  18. [id] => 2
  19. [page_name] => Add Branch Detail
  20. [page_url] => add-branch
  21. [parent_page_id] => 1
  22. [page_type] => 1
  23. [created_at] => 2018-06-23 23:45:54
  24. [updated_at] => 2018-06-23 23:45:54
  25. [deleted_at] =>
  26. [slug] => add_branch_detail
  27. )
  28. [1] => Array
  29. (
  30. [id] => 11
  31. [page_name] => View Branch Detail
  32. [page_url] => list-branch
  33. [parent_page_id] => 1
  34. [page_type] => 1
  35. [created_at] => 2018-06-23 23:46:08
  36. [updated_at] => 2018-06-23 23:46:08
  37. [deleted_at] =>
  38. [slug] =>
  39. )
  40. )
  41. )

我也试着找出问题所在

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [query] => select * from `pages` where `pages`.`deleted_at` is null
  6. [bindings] => Array
  7. (
  8. )
  9. [time] => 0.82
  10. )
  11. [1] => Array
  12. (
  13. [query] => select * from `pages` where `pages`.`parent_page_id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) and `pages`.`deleted_at` is null
  14. [bindings] => Array
  15. (
  16. [0] => 1
  17. [1] => 2
  18. [2] => 4
  19. [3] => 5
  20. [4] => 7
  21. [5] => 8
  22. [6] => 9
  23. [7] => 10
  24. [8] => 11
  25. [9] => 12
  26. )
  27. [time] => 0.86
  28. )
  29. )

现在我的问题是,如果我尝试得到相同的结果,那么mysql查询将是什么呢?它将在内部执行forloop还是在查询本身中生成结果。
它还会在循环中执行单独的查询来检索子菜单列表吗?

6l7fqoea

6l7fqoea1#

laravel的activerecord实现并没有将连接用于它的关系(对于其中的一些关系是这样的,但是对于像这样的关系是这样的) belongsToMany 需要使用透视表/中间表的位置)。
实际发生的情况是,eloquent将从表中获取相关的键,并执行另一个查询以获取所需的关系。 Post 有很多 Comment 数据库里有3个有ID的帖子 1 , 2 以及 3 .

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

将导致:
查询1

  1. SELECT * from `posts`

查询2

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

它将遍历第二个查询的结果,并将它们与第一个查询加载的模型相匹配。
如果您想查看从您的laravel应用程序运行的查询,我建议您安装:
laravel调试栏
发条装置
除此之外,这些工具中的任何一个都将向您显示正在运行的查询。

展开查看全部

相关问题