Doctrine中QueryBuilder实现带key offset的JOIN关联条件报错问题
问题原因分析
使用
Expr\Join::ON报错Expected end of string, got 'ON'的原因:
Doctrine QueryBuilder中,ON参数仅支持直接关联实体表的场景使用,如果你leftJoin的第一个参数是实体中已定义的关联属性(也就是你代码里的f.bar),QueryBuilder会默认读取实体注解/配置里的关联条件,不允许再通过ON自定义关联规则,所以触发语法报错。改用
Expr\Join::WITH后无匹配数据的原因:
当你基于已有关联属性f.bar做关联时,QueryBuilder会先拼接实体默认的关联条件(通常是f.id = b.id),你追加的WITH条件是在原有条件基础上做叠加,最终执行的关联条件变成f.id = b.id AND f.id = b.id - 1,显然没有符合条件的匹配项,所以getBar()返回null。
解决方案
你不需要修改数据库结构,只需要调整关联写法,不基于已有关联属性做join,直接关联Bar实体表即可完全自定义关联条件,和你写的原生SQL逻辑完全一致:
use Doctrine\ORM\Query\Expr; // 请替换下方的App\Entity\Bar为你自己项目中Bar实体的完整命名空间 return $this ->createQueryBuilder('f') ->select('f, b') ->leftJoin(\App\Entity\Bar::class, 'b', Expr\Join::ON, 'f.id = b.id - 1') ->getQuery() ->getResult();
结果处理说明
- 上述查询返回的结果为二维数组,每一项的结构为
[0 => Foo对象, 1 => Bar对象],你可以遍历结果手动把Bar对象赋值给Foo的bar属性,即可正常调用$element->getBar()获取数据。 - 如果你需要自动将关联结果映射到Foo实体的
bar属性,可以配置Doctrine结果集映射(Result Set Mapping)实现,不需要修改原有实体关联定义。
内容的提问来源于stack exchange,提问作者TheFrost
相关产品推荐
相关产品推荐

