【问题标题】:How can I do two joins by Laravel relationships?如何通过 Laravel 关系进行两次连接?
【发布时间】:2017-12-10 09:38:50
【问题描述】:

这是我的表结构:

// roles
+----+-------+
| id | name  |
+----+-------+
| 1  | admin |
| 2  | stuff |
+----+-------+

//pages
+----+---------------------+
| id |         path        |
+----+---------------------+
| 1  | users/list          |
| 2  | users/list/paginate |
| 3  | users/make          |
| 4  | posts/add           |
| 5  | posts/edit          |
+----+---------------------+

page_role
+---------+----------+
| page_id | role_id  |
+---------+----------+
| 1       | 1        |
| 1       | 2        |
| 1       | 3        |
| 1       | 4        |
| 1       | 5        |
| 2       | 4        |
| 2       | 5        |
+---------+----------+

我要做的就是获取每个角色的所有页面。我怎样才能通过在 Laravel 中使用关系来做到这一点?


这是我目前使用纯 SQL 的解决方法:

SELECT p.* FROM roles r
INNER JOIN page_role  pr on r.id = pr.role_id
INNER JOIN pages      p  on p.id = pr.page_id
ORDER BY p.id DESC

【问题讨论】:

  • 我可以看到您对您的问题(甚至没有帮助的问题)的答案进行投票。你有什么理由不赞成我的回答?也许您的反馈可以帮助我提高答案的质量,或者我错过了什么?

标签: php mysql sql laravel


【解决方案1】:

首先在Role 模型中定义belongsToMany() 关系:

public function pages()
{
    return $this->belongsToMany(Page::class);
}

然后,要获取每个角色的所有页面,请使用with() 方法:

$rolesWithPages = Role::with('pages')->get();

然后您将能够为每个角色迭代角色和页面:

@foreach ($rolesWithPages as $role)
    Role: {{ $role->name }}<br>
    @foreach ($role->pages as $page)
        Page: {{ $page->title }}<br>
    @endforeach
@endforeach

【讨论】:

  • 您能告诉我如何在其中添加where() 子句吗? $rolesWithPages = Role::with('pages')-&gt;get(); (我想在roles 表的位置应用)
  • @stack 如果是用于角色表,只需像这样添加它Role::with('pages')-&gt;where('status', 1)-&gt;get()
  • 你知道,我真的很困惑,每次我遇到一个新事物,belongsToManybelongsTohasOnehasManymanyToMany等等..!有所有这些东西的清单吗?
  • @stack 查看文档。那里的关系很好地解释了laravel.com/docs/5.5/…
  • 好的,作为我关于这个主题的最后一个问题,hasManybelongsToMany 之间有什么区别吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2014-08-17
  • 2019-05-24
  • 2019-09-04
  • 2016-10-15
相关资源
最近更新 更多