Doctrine查询提示实体无classificacao.abrir_tarefa字段但实际存在怎么办
问题原因
Doctrine的DQL不支持直接通过关联属性.字段的写法直接跨实体访问未声明关联的字段。你在原查询中直接写i.classificacao.abrir_tarefa时,DQL解析器会将classificacao.abrir_tarefa整体识别为App\Entity\ItemComunicacao实体的单个属性名,无法匹配到你定义的$classificacao关联属性,因此抛出对应报错。
修复方案
你需要先显式JOINclassificacao关联属性并赋予别名,再通过别名访问关联实体的abrir_tarefa字段,修改后的查询如下:
$array_ids_items = $this->em->createQuery( 'SELECT i.id, i.id_alt FROM App\Entity\ItemComunicacao i JOIN i.classificacao c WHERE i.id_tarefa IS NULL AND c.abrir_tarefa = TRUE' )->getArrayResult();
关于报错是否存在误导
该报错符合DQL的解析逻辑,不属于错误提示,但对不熟悉DQL关联查询规则的开发者存在一定的引导偏差:容易让开发者优先排查实体字段定义是否正确,而忽略了DQL本身的语法规则要求。
补充注意事项
- 如果需要保留
classificacao为null的ItemComunicacao记录,请将JOIN替换为LEFT JOIN - 所有跨实体的字段查询,都需要先对关联属性做JOIN声明后再通过别名访问对应字段
内容的提问来源于stack exchange,提问作者VBobCat
相关产品推荐
相关产品推荐

