Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 多对多自引用查询生成器_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 多对多自引用查询生成器

Symfony 多对多自引用查询生成器,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个名为Status的实体,它具有自引用多对多关系,以定义每个状态下一个可用状态是什么: class Status { private $id; //... /** * @ORM\ManyToMany(targetEntity="Status", mappedBy="nextStatuses") */ private $previousStatuses; /** * @ORM\ManyToMany(targetEnt

我有一个名为Status的实体,它具有自引用多对多关系,以定义每个状态下一个可用状态是什么:

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