【问题标题】:Perform specific SQL query on Laravel在 Laravel 上执行特定的 SQL 查询
【发布时间】:2019-01-22 21:59:09
【问题描述】:

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

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

了解用户是否具有 adminsupervisoremployee 权限的方法是通过 role_user 表连接用户、商店和角色(admin 角色在 role_shopshop_id 字段中设置 NULL 值> 表)。相反,所有者是通过 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

感谢大家的帮助!

【问题讨论】:

    标签: sql laravel eloquent union query-builder


    【解决方案1】:

    由于这里有两个选择,我建议先进行两个查询,然后将两个查询连接起来得到联合结果。

    $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% 正确,但您可以随意调整它以获得您想要的。

    Reference

    【讨论】:

    • 你太棒了,我的朋友。非常感谢。
    【解决方案2】:

    使用join方法并将结果按user_id分组

    $roles = DB::table('roles')
    ->where('user_id', '=', 1)
    ->join('shops', 'shops.user_id', '=', 'roles.user_id')
    //Add other tabalse as join then
    ->select('roles.*')
    ->groupby('roles.user_id')
    ->get();
    

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

    【讨论】:

    • 感谢您的回复!但是这个解决方案不起作用,因为所有者不是角色,因为它是商店表上的一个字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2019-07-22
    • 2021-11-14
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多