对Laravel执行特定的SQL查询

对Laravel执行特定的SQL查询,sql,laravel,eloquent,union,query-builder,Sql,Laravel,Eloquent,Union,Query Builder,我有一个管理商店、用户和角色的应用程序 每个用户可以是所有者、主管、员工或管理员 了解用户是否具有管理员、主管或员工权限的方法是通过连接用户、商店和角色的role_user表。管理员角色在role_shop表的shop_id字段中设置空值。所有者由shops表上的user_id字段获取 我想在我的用户模型上执行一个函数,以获取用户拥有的所有角色 下面的查询可以工作,但我不知道如何在Eloquent的查询生成器上执行它 SELECT priority, role, shop FROM (

我有一个管理商店、用户和角色的应用程序

每个用户可以是所有者、主管、员工或管理员

了解用户是否具有管理员、主管或员工权限的方法是通过连接用户、商店和角色的role_user表。管理员角色在role_shop表的shop_id字段中设置空值。所有者由shops表上的user_id字段获取

我想在我的用户模型上执行一个函数,以获取用户拥有的所有角色

下面的查询可以工作,但我不知道如何在Eloquent的查询生成器上执行它

SELECT priority, role, shop
FROM (
    (
        SELECT 1.5 AS priority, "owner" AS role, shops.id AS shop
        FROM shops
        WHERE shops.user_id = 1
    )

    UNION

    (
        SELECT roles.id AS priority, roles.name AS role, role_shop.shop_id AS shop
        FROM role_shop
        JOIN roles ON (roles.id = role_shop.role_id)        
        WHERE role_shop.user_id = 1
    )

) AS result
ORDER BY priority
谢谢大家的帮助

使用join方法并按用户id对结果进行分组

Ps:对不起,我的代码不完整,我用手机,你可以找到 laravel文档中的样本


因为这里有两个选择,所以我建议先进行两个查询,然后将两个查询合并以获得联合结果

$query1 = Shop::select(
    DB::RAW('"1.5" AS "priority"'),
    DB::RAW('"owner" AS "role"'),
    DB::RAW('id AS "shop"')
  )
  ->where('user_id', 1)
  ->orderBy('priority');

$query2 = RoleShop::join('roles AS roles', 'role_shop.role_id', '=', 'roles.id')
  ->select(
      DB::RAW('roles.id AS "priority"'),
      DB::RAW('roles.name AS "role"'),
      DB::RAW('role_shop.shop_id AS "shop"'),
  )
  ->where('role_shop.user_id', 1)
  ->orderBy('priority');

$result = $query1->union($query2)->get();
它可能不是100%正确,但可以随意调整以获得您想要的


谢谢你的回复!但是这个解决方案不起作用,因为所有者不是一个角色,因为它是商店表上的一个字段。我的朋友,你太棒了。非常感谢你。
$query1 = Shop::select(
    DB::RAW('"1.5" AS "priority"'),
    DB::RAW('"owner" AS "role"'),
    DB::RAW('id AS "shop"')
  )
  ->where('user_id', 1)
  ->orderBy('priority');

$query2 = RoleShop::join('roles AS roles', 'role_shop.role_id', '=', 'roles.id')
  ->select(
      DB::RAW('roles.id AS "priority"'),
      DB::RAW('roles.name AS "role"'),
      DB::RAW('role_shop.shop_id AS "shop"'),
  )
  ->where('role_shop.user_id', 1)
  ->orderBy('priority');

$result = $query1->union($query2)->get();