Symfony中Doctrine findBy()外键查询失效问题求助
问题排查与解决方案
这个问题我之前也碰到过,原因很明确——你搞混了Doctrine查询时的实体属性名和数据库表的字段名啦!
错误原因
Doctrine的Repository方法(比如findBy)是基于你定义的实体类属性来构建查询的,而不是直接用数据库表的字段名。你的RubricMenu实体里,关联Brand的属性是$brand(对应注解里的@ORM\JoinColumn(name="brand_id")),所以直接用brand_id作为查询键,Doctrine会识别不了,抛出Unrecognized field: brand_id的错误。
解决方法
这里给你几种可行的实现方式:
方式1:直接用实体属性名查询(最简单)
直接把查询数组里的brand_id改成brand,Doctrine会自动处理关联的主键映射:
$dbChoices = $this->getConfigurationPool() ->getContainer() ->get('Doctrine') ->getManager() ->getRepository('RibambelMainBundle:RubricMenu') ->findBy(array('brand' => 2)); // 这里用实体属性名brand,而非表字段brand_id
你可以直接传入Brand的主键ID,Doctrine会自动关联到对应的Brand实体。
方式2:用DQL自定义查询
如果需要更复杂的查询逻辑,可以用DQL来写:
$em = $this->getConfigurationPool()->getContainer()->get('Doctrine')->getManager(); $query = $em->createQuery( 'SELECT rm FROM RibambelMainBundle:RubricMenu rm WHERE rm.brand = :brandId' )->setParameter('brandId', 2); $dbChoices = $query->getResult();
方式3:用QueryBuilder构建查询
QueryBuilder更灵活,适合动态拼接查询条件:
$em = $this->getConfigurationPool()->getContainer()->get('Doctrine')->getManager(); $dbChoices = $em->getRepository('RibambelMainBundle:RubricMenu') ->createQueryBuilder('rm') ->where('rm.brand = :brandId') ->setParameter('brandId', 2) ->getQuery() ->getResult();
补充说明
因为你已经通过@ORM\ManyToOne和@ORM\JoinColumn定义了$brand和数据库brand_id字段的映射关系,Doctrine会自动处理两者之间的转换,所以查询时务必使用实体的属性名,而不是直接操作数据库字段名。
内容的提问来源于stack exchange,提问作者bastien
相关产品推荐
相关产品推荐

