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)
;
}
}