调用Doctrine createQueryBuilder报Undefined method错误的技术求助
报错根因与解决方案
错误本质
你当前代码的最终返回对象是Doctrine\ORM\EntityManagerInterface的实例,这个类本身根本没有createQueryBuilder()方法。这个方法是Doctrine\ORM\EntityRepository类独有的,直接在EntityManager上调用,自然会触发方法未定义的报错。
对应修正写法
- 如果你需要基于某类实体构造查询,先拿到对应实体的Repository实例,再调用createQueryBuilder方法,示例代码:
// 替换为你实际要查询的实体类路径 $userRepo = $this->getDoctrine()->getRepository(\App\Entity\User::class); $qb = $userRepo->createQueryBuilder('u'); - 如果你不需要绑定特定实体、要直接构造通用DQL查询,别从EntityManager上调不存在的方法,直接用EntityManager原生提供的
createQuery()方法拼DQL就行:$em = $this->getDoctrine()->getManager(); $query = $em->createQuery('SELECT u FROM App\Entity\User u WHERE u.id = :userId'); $query->setParameter('userId', 1);
附加排查点
- 如果这个报错是IDE的代码提示(不是实际跑代码抛的运行时错误),检查下IDE的Doctrine插件是不是正常加载了、有没有正确索引Vendor目录下的Doctrine类文件,很多时候插件没配好就会乱报方法不存在的提示。
- 可以在报错那行前面加一行打印,输出
get_class($this->getDoctrine()->getManager())的结果,确认拿到的对象类型对不对,排除依赖注入时类型不匹配、对象错配的问题。
内容的提问来源于stack exchange,提问作者VIJETA RAIKAR
相关产品推荐
相关产品推荐

