Laravel Eloquent 不支持原生 CTEWITH 子句直至 10.x 仍需通过 DB::select() 执行带绑定参数的原始 SQLQuery Builder 拼接易出错第三方包兼容性有限推荐拆分为视图或用 Service 封装。PHP Laravel 中 Eloquent 不支持原生 CTEWITH 子句Eloquent 本身不提供 with() 方法来定义 SQL 的 WITH 公用表表达式——这和 Eloquent 的 with() 关联预加载完全无关纯属命名冲突带来的误解。Laravel 直到 10.x 仍未在 Query Builder 或 Eloquent 中内置 CTE 支持所有“Eloquent 使用 CTE”的说法本质都是绕过 Eloquent、退回到原生查询或 Query Builder 手动拼接 WITH。必须用 DB::select() 或 DB::statement() 执行带 WITH 的原始 SQL如果你确实需要递归层级查询如组织架构树、多步中间结果复用如先算分组统计再排名又不想写纯 PDO最稳妥的方式是用 DB::select() 配合绑定参数CTE 必须写在语句最前面且紧邻 SELECT不能有空行或注释隔开DB::select() 返回数组不是 Eloquent Collection无法链式调用 map() 或访问模型属性参数绑定只支持 ? 占位符不支持 :named 参数若需动态表名/字段名必须白名单校验后字符串拼接严禁用户输入直插DB::select(WITH active_users AS ( SELECT id, name FROM users WHERE status ?)SELECT u.name, COUNT(p.id) as post_countFROM active_users uLEFT JOIN posts p ON p.user_id u.idGROUP BY u.id, [active]);Query Builder 拼 CTE 很容易出错慎用有人尝试用 DB::table()-fromRaw(WITH ...) 或多次 -fromSub() 嵌套模拟 CTE但极易触发以下问题MySQL 8.0 和 PostgreSQL 支持 CTE但 SQLite、SQL Server旧版不支持 —— fromRaw() 会直接报错无降级路径fromSub() 生成的子查询会被括号包裹而 CTE 要求 WITH cte AS (subquery) 中的 subquery 不能有多余括号否则语法错误复杂 CTE尤其递归依赖 RECURSIVE 关键字和 UNION ALL 结构Query Builder 无法生成硬拼易漏关键字或括号错位真要“类 Eloquent”体验选包或换思路第三方包如 staudenmeir/laravel-cte 可让 Query Builder 支持 withExpression()但它本质仍是封装原始 SQL且 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具