laravel 使用内部查询构建器通过雄辩生成“WITH AS”[重复]

mdfafbf1  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(154)

此问题在此处已有答案

How to use WITH clause in Laravel Query Builder(2个答案)
8小时前关门了。
我如何在雄辩中生成这个(postgresql)查询的等效查询

WITH result as (
select *, order_id as alias_id from orders
)
SELECT *
FROM result;

我应该可以通过内部查询作为雄辩的建设者查询。

alen0pnh

alen0pnh1#

您不需要CTE(with expression)。CTE是子查询概念的扩展。最初是为了可以重复使用它,而不是每次使用都编写它。但由于您只使用它一次,因此使用子查询就可以了。您的查询可以重写为:

select result.*
  from ( select *, order_id as alias_id 
           from orders
       ) result;

根据你的描述,我假设上面的子查询是 * 内部查询作为雄辩的构建器查询 *。否则它减少到select *, order_id as alias_id from orders
我不知道Laravel/Eloquent Query Builder,但我认为它应该可以轻松处理简单的子查询。

lymnna71

lymnna712#

正如注解中所述,Laravel在它的查询生成器中不支持WITH子句(公共表表达式)。但是,您可以以原始形式传递它。

$query = 'WITH results AS (
    SELECT *, order_id AS alias_id
FROM orders
)
SELECT *
FROM results';

$results = DB::select($query);

我在评论中提到了一个包,我发现staudenmeir/laravel-cte运行得很好,根据你的laravel版本,你可能需要安装一个特定的composer版本。
安装了这个包之后,您可以像这样表达您的查询,使它看起来最像原始SQL:

$results = DB::query()
    ->withExpression('results', function ($query) { // WITH results AS (
        $query->select('*', 'order_id AS alias_id') //   SELECT *, order_id AS alias_id
            ->from('orders');                       //   FROM orders
    })                                              // )
    ->select('*')                                   // SELECT *
    ->from('results')                               // FROM results
    ->get();

相关问题