Php doctrine2 notIN函数中的子查询

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”、

我想选择非特定服务的成员。我有三张桌子:

记忆 服务 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”已定义


同一个别名不能在同一查询中定义两次

$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();