如何使用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
相关产品推荐
相关产品推荐

