如何用Eloquent生成PostgreSQL的WITH AS查询(支持传入子查询构造器)
等效的Eloquent实现代码
你可以通过Eloquent的with方法实现PostgreSQL中的CTE(公共表表达式)查询,同时用查询构造器构建内部子查询,具体代码如下:
使用模型的实现方式
假设存在对应orders表的Order模型:
use App\Models\Order; // 构建内部子查询(对应CTE中的select语句) $subQuery = Order::query() ->selectRaw('*, order_id as alias_id'); // 执行CTE查询并获取结果 $finalResult = Order::query() ->with('result', $subQuery) ->select('*') ->from('result') ->get();
使用DB门面的实现方式
如果无需使用模型,直接通过DB门面也能实现:
use Illuminate\Support\Facades\DB; // 构建内部子查询 $subQuery = DB::table('orders') ->selectRaw('*, order_id as alias_id'); // 执行CTE查询 $finalResult = DB::query() ->with('result', $subQuery) ->select('*') ->from('result') ->get();
代码说明
with('result', $subQuery):定义名为result的CTE,第二个参数传入构造器形式的子查询selectRaw('*, order_id as alias_id'):对应原SQL中select *, order_id as alias_id from orders的逻辑from('result'):指定从CTE定义的result结果集中查询数据
内容的提问来源于stack exchange,提问作者Marcos DaSilva
相关产品推荐
相关产品推荐

