doctrine querybuilder 是安全组装查询的桥梁,需在 repository 封装、绑定参数、链式调用、动态条件用 where/andwhere、关联用 join/leftjoin、调试用 getsql() 和 getparameters()。

Doctrine 查询构建器(QueryBuilder)在 Symfony 2.2.11 中虽版本较老,但核心机制已成熟稳定。它不是写 SQL 的替代品,而是用对象方式安全组装查询的桥梁——重点在于避免拼接、正确处理关联、动态适配条件。
从 Repository 开始写,别在 Controller 里拼查询
所有查询逻辑应封装在对应 Entity 的 Repository 类中(如 UserRepository),这样便于复用、测试和维护。Controller 只负责传参和调用方法。
- 用 $this->createQueryBuilder('u') 获取构建器,'u' 是实体别名,不是表名
- 每个变量值必须通过 setParameter() 绑定,严禁字符串拼接
- 基础操作链式调用即可:select() → where() → orderBy() → getQuery() → getResult()
动态条件要分清 where 和 andWhere
前端传来的筛选参数(如 status、q、minPrice)往往不全存在,需按需添加条件。
- 第一个条件用 where(),后续统一用 andWhere() 或 orWhere()
- 每个条件使用独立参数名(如 :search、:minPrice),避免重复绑定冲突
- 模糊搜索用 $qb->expr()->like(),别名+参数组合更安全
关联查询必须用 join/leftJoin,不能靠循环查
查用户列表同时要带出用户名、所属部门、最近一条订单,这类需求若用 foreach + find() 就是典型的 N+1 问题。
- 用 join('u.department', 'd') 或 leftJoin('u.orders', 'o'),其中 'u.department' 是实体属性名,不是数据库字段
- 想取关联字段内容,得配合 addSelect('d.name') 或 addSelect('o.total')
- LEFT JOIN 后若在 where 中对关联字段加非空限制(如 andWhere('o.status = :status')),实际效果等同 INNER JOIN
调试时快速看生成的 SQL
开发阶段常需确认 QueryBuilder 是否生成了预期语句。
- 调用 getSQL() 可获取底层原生 SQL(含占位符 ? 或 :param)
- 调用 getParameters() 查看当前绑定的参数值
- 注意:getSQL() 不会自动替换参数,仅用于分析结构;生产环境切勿手动拼值











