如何使用左连接和内连接编写 laravel 查询?

Posted

技术标签:

【中文标题】如何使用左连接和内连接编写 laravel 查询?【英文标题】:How to write laravel query with left join and a inner join? 【发布时间】:2019-06-17 06:59:17 【问题描述】:

我有以下表格,并且想用一个条件进行左连接,并从左连接表中进行另一个内连接,

用户表

编号 |姓名 1 约翰 2山姆 3 塞西尔

角色表

编号 |姓名 1 名管理员 2 编辑

model_has_roles 表

角色 ID |型号类型 | model_id 1 应用\用户 1 2 应用\用户 2

我想要什么

如果 model_type 是 'App\User',则在 user.id 和 model_has_roles.model_id 列上对 user 表和 model_has_roles 表进行左连接,然后在 Roles 表和 model_has_roles 表之间进行另一个内连接role_id 和 Roles.id 列。所以结果应该是这样的,

编号 |姓名 |角色 1 约翰 管理员 2山姆编辑 3 塞西尔 -

我尝试了以下查询但无法正常工作,

 DB::table('users')->select('id', 'name', 'email', 'created_at', 'role_id')
            ->leftJoin('model_has_roles', 'model_has_roles.model_id', '=', 'users.id')
            ->where('model_has_roles.model_type', '=', 'App\User')
            ->paginate(1);

如果你能帮我写一个雄辩的查询。

谢谢

P.S:实际上,我正在使用 spatie/laravel-permission,并试图获取所有用户的角色名称。

【问题讨论】:

为什么不使用它们的内置函数,如$user->getPermissionsViaRoles(); 如果我有 50 个用户并且想在列出所有用户时调用此方法 50 次会发生什么?会不会导致性能下降?我就是这么想的 【参考方案1】:

这应该可以正常工作:

App\User::with('roles')->get();

【讨论】:

是的,你救了我!!这对我有用, $roles = Role::all(); $users = User::with('roles')->paginate(1);

以上是关于如何使用左连接和内连接编写 laravel 查询?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个查询中使用左连接和内连接

结合左外连接和内连接 + 聚合函数 - 空结果集问题

左连接和内连接组

ms-access 中的左连接和内连接

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

左、右、外连接和内连接有啥区别? [复制]