Symfony4中EntityManager createQuery实体参数化报错,如何用QueryBuilder写SQL?
问题解答
Doctrine的DQL不支持将实体类作为参数通过setParameter()绑定,因为DQL在解析阶段就需要明确实体的元数据,参数绑定是解析完成后才会执行的操作,所以你用:entity占位符会触发语法错误,这就是你看到报错的原因。
如果要动态指定实体类,直接把类名拼接到DQL字符串里即可:
use test\coreBundle\Entity\Product; ... $query = $em->createQuery(sprintf("SELECT p FROM %s p JOIN p.productdetails d", Product::class));
关于你问的QueryBuilder:完全可以用它编写完整的查询,而且QueryBuilder更适合动态构建查询,还能避免手动拼接字符串的问题。对应你的需求,写法如下:
use test\coreBundle\Entity\Product; ... $queryBuilder = $em->createQueryBuilder() ->select('p') ->from(Product::class, 'p') ->join('p.productdetails', 'd'); $query = $queryBuilder->getQuery();
这样既实现了和原代码一致的查询逻辑,又符合Symfony 4的使用规范,不会出现语法错误。
内容的提问来源于stack exchange,提问作者Christian Stegemann
相关产品推荐
相关产品推荐

