Symfony 多对多自引用查询生成器
我有一个名为Status的实体,它具有自引用多对多关系,以定义每个状态下一个可用状态是什么:Symfony 多对多自引用查询生成器,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个名为Status的实体,它具有自引用多对多关系,以定义每个状态下一个可用状态是什么: class Status { private $id; //... /** * @ORM\ManyToMany(targetEntity="Status", mappedBy="nextStatuses") */ private $previousStatuses; /** * @ORM\ManyToMany(targetEnt
class Status
{
private $id;
//...
/**
* @ORM\ManyToMany(targetEntity="Status", mappedBy="nextStatuses")
*/
private $previousStatuses;
/**
* @ORM\ManyToMany(targetEntity="Status", inversedBy="previousStatuses")
* @ORM\JoinTable(name="status_mapping",
* joinColumns={@ORM\JoinColumn(name="status_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="next_status_id", referencedColumnName="id")}
* )
*/
private $nextStatuses;
/**
* @ORM\OneToMany(targetEntity="OrderStatus", mappedBy="status")
* @ORM\OrderBy({"createdTime" = "ASC"})
*/
private $orderStatuses;
//...
/**
* Constructor
*/
public function __construct()
{
$this->nextStatuses = new \Doctrine\Common\Collections\ArrayCollection();
$this->previousStatuses = new \Doctrine\Common\Collections\ArrayCollection();
}
//...
}
我正在创建一个表单类型,需要将状态实体添加为一个字段,并将其选择限制为$nextStatuses
问题是EntityType需要一个查询生成器,我不能简单地说$status->getNextStatuses()
我目前拥有的(并且有一些变体,但都不起作用):
上述查询导致“previousStatuses”附近的第80列第0行出现错误
[语义错误]:错误:无效的PathExpression。应为StateFieldPathExpression或SingleValuedAssociationField。
以前的状态关联是一个数组集合
,因此对于条令,此语句是错误的:
->where('s.previousStatuses = :status')
使用where
小条款中的ps
别名,如下所示:
//...
return $er->createQueryBuilder('s')
->leftJoin('s.previousStatuses', 'ps')
->where('ps.id = :status') // <---- here
->setParameter('status', $status);
/。。。
返回$er->createQueryBuilder('s')
->leftJoin('s.previousStatuses','ps')
->其中('ps.id=:status')//setParameter('status',$status);
我假设
状态
实体的状态
字段,但这可能是名称
或任何其他,在您的实体中检查此字段。我很困惑。。。。[语义错误]第0行,第78列“status=:st”附近:错误:类AppBundle\Entity\status没有名为status的字段或关联。。。status是实体的名称,我可能需要查询statusId吗?我很困惑…我不知道您需要准确比较的属性名称是什么,问题是可能的$status
值是什么?哪个是实体中与其匹配的属性名称?好吧,用简单的英语我是说:查找所有先前状态为$status的状态记录。。。意思是,我下一步可能的状态是什么。。。连接表基本上将状态映射到可能的下一个状态。如果$status
是状态的实例,那么只需使用where('ps.id=:status')
我就用它更新我的答案。
//...
return $er->createQueryBuilder('s')
->leftJoin('s.previousStatuses', 'ps')
->where('ps.id = :status') // <---- here
->setParameter('status', $status);