代码之家  ›  专栏  ›  技术社区  ›  Marcos DaSilva

使用内部查询生成器通过雄辩生成“WITH AS”

  •  -4
  • Marcos DaSilva  · 技术社区  · 1 年前

    我如何在雄辩中生成这个(postgresql)查询的等价物

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

    我应该能够将内部查询作为雄辩的构建器查询传递。

    0 回复  |  直到 1 年前
        1
  •  1
  •   Belayer    1 年前

    您不需要CTE(带表达式)。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,但我认为它应该很容易处理一个简单的子查询。

        2
  •  0
  •   IGP    1 年前

    如注释中所述,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();