在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?

Posted

技术标签:

【中文标题】在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?【英文标题】:In Laravel Eloquent how could you do two union queries and a select outside the union scope? 【发布时间】:2021-12-19 11:34:53 【问题描述】:

Laravel Eloquent 示例

        $union = User::select([
            DB::raw("id"),
            DB::raw("name")
        ])
            ->rightJoin("roles as t2", function ($join) 
                $join->on("users.role_id", '=', "t2.id");
            );

        $query = User::select(
            [
                  DB::raw("id"),
                  DB::raw("name")
            ]
        )
            ->leftJoin('roles', function ($join)
                $join->on("users.role_id", '=', "roles.id");
            )
            ->union($union);
           $query->select('name');

我想使用 Laravel 重现 mysql 查询

select name from
((select id, name
 from `users`
          left join `roles` on `users`.`role_id` = `roles`.`id`)
union
(select id, name
 from `users`
          right join `roles` as `t2` on `users`.`role_id` = `t2`.`id`)
) as smth;

但是使用$query->select('name'); 只是覆盖了左连接联合中的选择。

附:我简化了我的真实案例查询(删除了 group bys 和特殊连接条件等),当示例可能对真实案例使用没有意义时,但演示仍然显示问题 - 需要在联合范围之外有一个 select 语句.

【问题讨论】:

【参考方案1】:

你应该试试这个。

$outSideQuery = DB::raw("($unionedQuery->toSql()) as smth")->select('name');

【讨论】:

【参考方案2】:

要向查询中添加新的选择列,您可以使用addSelect 方法:

 $query->addSelect('name');

【讨论】:

以上是关于在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在你已经获得的东西上使用 Laravel Eloquent ::with()?

如何在 Laravel/Eloquent 中获得完整的关系

如何使用 eloquent 在 laravel 中编写多个连接

在最近的关系记录中搜索 - Laravel (Eloquent)

如何在 Laravel Eloquent 中选择某些字段?

如何使用 Eloquent 在 Laravel 中开始查询?