Php doctrine2 notIN函数中的子查询
我想选择非特定服务的成员。我有三张桌子: 记忆 服务 membre_membre和服务之间的服务关系 我使用的是条令2,在SQL中,我的查询是: 从membre m中选择m.*m,其中m.`id`不在 从membre_服务ms中选择ms.membre_id,其中ms.service_id!=29 在理论上,我确实: $qb=$this->\u em->createQueryBuilder; $qb2=$qb; $qb2->选择“m.id” ->来自“自定义\实体\ MembreService”、“ms” ->leftJoin'ms.membre',m' ->“ms.id!=”在哪里?1' ->setParameter1$service; $qb=$this->\u em->createQueryBuilder; $qb->选择'm' ->从'Custom\Entity\Membre','m' ->其中$qb->expr->notIn'm.id',$qb2->getDQL ; $query=$qb->getQuery; //$query->useResultCachetrue,1200,_函数; 返回$query->getResult; 我得到了以下错误: 语义错误]第0行,第123列,靠近'm WHERE ms.id':错误:“m”已定义Php doctrine2 notIN函数中的子查询,php,doctrine-orm,query-builder,Php,Doctrine Orm,Query Builder,我想选择非特定服务的成员。我有三张桌子: 记忆 服务 membre_membre和服务之间的服务关系 我使用的是条令2,在SQL中,我的查询是: 从membre m中选择m.*m,其中m.`id`不在 从membre_服务ms中选择ms.membre_id,其中ms.service_id!=29 在理论上,我确实: $qb=$this->\u em->createQueryBuilder; $qb2=$qb; $qb2->选择“m.id” ->来自“自定义\实体\ MembreService”、
同一个别名不能在同一查询中定义两次
$qb = $this->_em->createQueryBuilder();
$qb2 = $qb;
$qb2->select('m.id')
->from('Custom\Entity\MembreService', 'ms')
->leftJoin('ms.membre', 'm')
->where('ms.id != ?1');
$qb = $this->_em->createQueryBuilder();
$qb->select('mm')
->from('Custom\Entity\Membre', 'mm')
->where($qb->expr()->notIn('mm.id', $qb2->getDQL())
);
$qb->setParameter(1, $service);
$query = $qb->getQuery();
return $query->getResult();
理想情况下,您应该为实体使用多对多关系,在这种情况下,您的查询将更加简单。实际上,如果您使用的是Symfony2存储库类,您还可以执行以下操作:
$in = $this->getEntityManager()->getRepository('Custom:MembreService')
->createQueryBuilder('ms')
->select('identity(ms.m)')
->where(ms.id != ?1);
$q = $this->createQueryBuilder('m')
->where($q->expr()->notIn('m.id', $in->getDQL()))
->setParameter(1, $service);
return $q->getQuery()->execute();
您不能使用以下成员:
有关更多示例,请参阅。感谢您的回答!MembreService已经在多对多。。。你真的帮了我的忙!最后的答案见我的编辑。如果您正在子查询中使用参数,愿上帝保佑您:$qb->setParameters$qb2->getParameters;是必需的,但您可能希望$qb->setParametersarray\u合并$qb2->getParameters,$qb->getParameters以避免覆盖外部查询中的参数。Hmmm。。。就拿我最后的评论来说,这似乎只在某些版本的教义中起作用。。。在其他版本中,setParameters将替换而不是添加到参数中……嗨,有点困惑,为什么要实例化$qb两次,一次在第1行,一次在第8行?这是必要的还是仅仅是一个输入错误?谢谢。我一直在寻找一种方法来处理不同的存储库,您的解决方案成功了。在$q->expr中,$q是什么?$q是QueryBuilder的一个实例。正确的代码如下所示:$q=$this->createQueryBuilder'm'$q->where$q->expr->notIn…如果您忘记where子句中的引号,请添加它。
<?php
$query = $em->createQuery('SELECT m.id FROM Custom\Entity\Membre WHERE :service NOT MEMBER OF m.services');
$query->setParameter('service', $service);
$ids = $query->getResult();