在Symfony2中的表单类型中,我想包含一个实体字段和查询生成器,以便选择要显示的行。 我的查询很复杂,我无法弄清楚使用查询生成器的方式,我想使用DQL。 不幸的是,我不能做$repository->createQuery(...)
和$repository->getEntityManager()->createQuery()
。只有$repository->createQueryBuilder(...)
有效。 有没有办法解决这个问题?无法从表单构建器的存储库中获取EntityManager
顺便说一句,如果你碰巧发现执行我的SQL请求,这将是非常有用的一个更聪明的方式(但不是这个问题的话题!)
public function buildForm(FormBuilderInterface $builder, array $options)
{
$user = $this->user;
$builder
->add('friend', 'entity',
array(
'class' => 'MyappUserBundle:User',
'label' => 'User',
'query_builder' => function(EntityRepository $repository) use ($user) {
$query = $repository->getEntityManager()->createQuery("
SELECT u
FROM MyappUserBundle:User u
WHERE
u.id NOT IN (SELECT friend FROM MyappUserBundle:Friendrequest WHERE user = :user)
AND
u.id NOT IN (SELECT user FROM MyappUserBundle:Friendrequest WHERE friend = :user)
AND
u.id != :user
")
->setParameter('user', $user)
;
return $query;
}
)
)
;
}
谢谢你的详细解答。我做了谷歌的EntityRepository类的参考,但它留给我2个问题(我应该在我的问题中提到)。首先,我真的不喜欢使用'NativeNamedQuery'(谁做?),其次,我不明白为什么调用'getEntityManager'会抛出一个错误500'未定义的方法'getEntityManager'“。我现在将使用您的解决方案。就删除子查询而言,我完全支持它,但我不知道在表单构建器中访问不同存储库的方法... – arnaudrg
getEntityManager方法具有受保护的范围,因此您可以在这个上下文中调用它(认为'Doctrine'>'EntityManager'>'Repository',所以设计它们可能不希望Repository类访问另一个Repository并且做一些疯狂的事情)。你也可以访问'createQueryBuilder'和'createNamedQuery'方法,尽管你可能无法做子查询(我从来没有尝试过,因为子查询不是很好)。当你创建表单时,你可以将选项传递给构造函数,使用你想要放入'NOT IN'语句的id。 –
这很有道理。再次感谢! – arnaudrg