在一个项目中,我在Postgres中使用公用表表达式(CTE)来表示表上的递归表达式。递归表达式计算父项下的所有子行。
我使用Laravel框架和查询构建器来编写此查询。我想避免原始查询。我正在寻找一种在查询构建器语法中链接CTE的方法,但我最终得到了一个原始查询(DB::select('raw query here'))
。
有没有办法可以链接CTE部分?如下面的伪代码:
DB::statement('WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
UNION ALL
SELECT p.sub_part, p.part, p.quantity
FROM included_parts pr, parts p
WHERE p.part = pr.sub_part')
->select('subpart')
->table('included_parts')
->join('bar', 'foo.id', '=', 'bar.foo_id')
->etc etc more query expressions
答案 0 :(得分:0)
我为常见的表表达式创建了一个程序包:https://github.com/staudenmeir/laravel-cte
$query = 'SELECT sub_part, part, quantity FROM parts [...]';
DB::table('included_parts')
->withRecursiveExpression('included_parts', $query, ['sub_part', 'part', 'quantity'])
->select('subpart')
->join('bar', 'foo.id', '=', 'bar.foo_id')
->[...]
您还可以提供查询构建器实例:
$query = DB::table('parts')
->where('part', 'our_product')
->unionAll(
DB::query()->[...]
)
DB::table('included_parts')
->withRecursiveExpression('included_parts', $query, ['sub_part', 'part', 'quantity'])
->select('subpart')
->join('bar', 'foo.id', '=', 'bar.foo_id')
->[...]