【问题标题】:How can I check matching two values in a pivot table?如何检查数据透视表中的两个值是否匹配?
【发布时间】:2018-05-16 23:43:39
【问题描述】:

这是我的代码:

$role_id = Auth::user()->role_id;
$page_id = Page::where('path', $request->path())->where('method', $_SERVER["REQUEST_METHOD"])->first()->id;

所以我同时拥有role_idpage_id。我也有一张这样的桌子:

// role_pages
+---------+---------+
| role_id | page_id |
+---------+---------+
| 1       | 1       |
| 1       | 2       |
| 1       | 4       |
| 1       | 8       |
| 2       | 1       |
| 2       | 3       |
| 2       | 7       |
| 3       | 1       |
| 3       | 9       |
+---------+---------+

注意到role_pages(role_id, page_id) 上有一个复合唯一索引。如您所见,逻辑是:每个角色都有多个页面。

无论如何,如何根据我的值检查上表中是否有任何行?注意到我可以通过使用EXISTS() 函数在纯 SQL 中做到这一点。但我想知道我怎么能在 laravel 中做到这一点?

【问题讨论】:

    标签: mysql sql laravel


    【解决方案1】:

    如何检查表中是否有任何行

    使用contains() 方法,正如我在here 中描述的那样。

    例子:

    $page = Page::where('path', $request->path())->where('method', $_SERVER["REQUEST_METHOD"])->first();
    $page->roles()->contains(Auth::user()->role_id);
    

    或者:

    $role = auth()->user()->role;
    $pageId = Page::where('path', $request->path())->where('method', $_SERVER["REQUEST_METHOD"])->first()->id;
    $role->pages()->contains($pageId);
    

    【讨论】:

    • roles() 是什么?
    • @stack roles()pages() 是模型中定义的多对多关系 (belongsToMany)。
    • 啊...我应该在模型中手动定义它们还是默认定义它们?
    • @stack 你需要定义这些。这是一个例子laravel.com/docs/5.5/eloquent-relationships#many-to-many
    • 我明白了,谢谢.. 只是您的解决方案中含糊不清的部分是:您根本没有使用 role_pages 表。那就是我要检查的数据透视表中是否有匹配的行。
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多