You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Laravel Eloquent编写含WITH子句的查询

Laravel编写含WITH子句查询的实现方法

要实现你提供的这类包含WITH子句的查询,Laravel里有两种实用的实现方式:

方式一:用withExpression(官方推荐)

Laravel 8及以上版本支持withExpression方法,专门用来定义CTE(也就是WITH子句),写法更贴合ORM风格:

use Illuminate\Support\Facades\DB;

// 构建查询
$query = DB::table('a')
    // 定义WITH子句里的`s`表
    ->withExpression('s', function ($subQuery) {
        $subQuery->select('id')
                 ->from('s');
    })
    ->select('a.*')
    ->leftJoin('s', 's.id', '=', 'a.s_id');

// 获取查询结果
$results = $query->get();

要是需要给CTE加筛选条件,直接在闭包里补充就行,比如只取s表中状态为1的记录:

->withExpression('s', function ($subQuery) {
    $subQuery->select('id')
             ->from('s')
             ->where('status', 1);
})

方式二:原生SQL查询

如果更偏好原生SQL的写法,直接用DB::select执行完整语句也可以:

// 原生SQL语句
$sql = "with s as (select s.id from s) select a.* from a left join s on s.id = a.s_id";
// 执行查询
$results = DB::select($sql);

如果要绑定参数避免SQL注入,只需要把参数用占位符?代替,再传入参数数组:

$targetStatus = 1;
$sql = "with s as (select s.id from s where status = ?) select a.* from a left join s on s.id = a.s_id";
$results = DB::select($sql, [$targetStatus]);

内容的提问来源于stack exchange,提问作者jeyGey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:15:40