Php doctrine2查询生成器中的子查询出错

Php doctrine2查询生成器中的子查询出错,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有一个带有子查询的查询: $query = $this->getEntityManager()->createQueryBuilder(); $subquery = $query; $subquery ->select('f.following') ->from('ApiBundle:Follow', 'f') ->where('f.follower = :follower_id')

我有一个带有子查询的查询:

$query = $this->getEntityManager()->createQueryBuilder();
    $subquery = $query;
    $subquery
        ->select('f.following')
        ->from('ApiBundle:Follow', 'f')
        ->where('f.follower = :follower_id')
        ->setParameter('follower_id', $id)
    ;

    $query
        ->select('c')
        ->from('ApiBundle:Chef', 'c')
        ->where('c.id <> :id')
        ->setParameter('id', $id)
    ;
    $query
        ->andWhere(
            $query->expr()->notIn('c.id', $subquery->getDQL())
        );

    return $query->getQuery()->getResult();

我找不到错误的原因,别名f只定义了一次。有什么建议吗?

这个问题是关于PHP中的对象和引用的

当您执行
$subquery=$query
$query
作为一个对象,只需将
$subquery
指向相同的值即可

PHP引用是一个别名,它允许使用两个不同的变量 写入相同的值。从PHP5开始,对象变量不起作用 不再将对象本身作为值包含。它只包含一个对象 允许对象访问器查找实际对象的标识符。 将一个对象[…]指定给另一个对象时 变量,不同的变量不是别名:它们包含 指向同一对象的标识符

参考:

这意味着在您的代码中,当您编写以下内容时:

$subquery
    ->select('f.following')
    ->from('ApiBundle:Follow', 'f')
    ->where('f.follower = :follower_id')
    ->setParameter('follower_id', $id)
;
这相当于:

$query
    ->select('f.following')
    ->from('ApiBundle:Follow', 'f')
    ->where('f.follower = :follower_id')
    ->setParameter('follower_id', $id)
;
因此,当您在结束通话时:

$query->andWhere(
        $query->expr()->notIn('c.id', $subquery->getDQL())
    );
您正在使用两个不同变量(
$query====$subquery
)指向的同一对象的两次

要解决此问题,您可以使用:

$query = $this->getEntityManager()->createQueryBuilder();
$subquery = $this->getEntityManager()->createQueryBuilder();
或关键字:


我想分享我需要ORM映射的解决方案:

以下实体的映射方式如下所示: 活动1:M参与者

Participant class
 /**
 * @ORM\ManyToOne(targetEntity="KKB\TestBundle\Entity\Event", inversedBy="participants")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id", nullable=false)
 */
private $event;

Event class
/**
 * @ORM\OneToMany(targetEntity="KKB\TestBundle\Entity\Participant", mappedBy="event", cascade={"persist"})
 */
private $participants;


class EventRepository extends \Doctrine\ORM\EntityRepository
{

public function getEventList($userId)
{

    $query = $this->createQueryBuilder('e');
    $subquery = $this->createQueryBuilder('se');

    $subquery
        ->leftJoin('se.participants', 'p')
        ->where('p.user = :userId')
        ;

    return $query->where($query->expr()->notIn('e.id', $subquery->getDQL()))
        ->setParameter('userId', $userId)
        ;
}

}

非常感谢,但现在错误是:[语义错误]第0行,第74列“following FROM”附近:错误:无效的PathExpression。必须是StateFieldPathExpression。@m4t1t0是否可以帮助:
$query = $this->getEntityManager()->createQueryBuilder();
$subquery = clone $query;
Participant class
 /**
 * @ORM\ManyToOne(targetEntity="KKB\TestBundle\Entity\Event", inversedBy="participants")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id", nullable=false)
 */
private $event;

Event class
/**
 * @ORM\OneToMany(targetEntity="KKB\TestBundle\Entity\Participant", mappedBy="event", cascade={"persist"})
 */
private $participants;


class EventRepository extends \Doctrine\ORM\EntityRepository
{

public function getEventList($userId)
{

    $query = $this->createQueryBuilder('e');
    $subquery = $this->createQueryBuilder('se');

    $subquery
        ->leftJoin('se.participants', 'p')
        ->where('p.user = :userId')
        ;

    return $query->where($query->expr()->notIn('e.id', $subquery->getDQL()))
        ->setParameter('userId', $userId)
        ;
}

}