【问题标题】:Many to Many Self Referencing Query_builder多对多自引用 Query_builder
【发布时间】:2017-02-01 08:59:48
【问题描述】:

我有一个名为 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 需要一个 query_builder 我不能简单地说 $status->getNextStatuses()

我目前拥有的(并且有一些变体,但都没有奏效):

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //Current status passed as option
        $status = $options['status'];
        $builder->add('status', EntityType::class, array(
            'class' => 'AppBundle\Entity\Status',
            'query_builder' => function (StatusRepository $er) use ($status) {
                return $er->createQueryBuilder('s')
                    ->leftJoin('s.previousStatuses', 'ps')
                    ->where('s.previousStatuses = :status')
                    ->setParameter('status', $status);
            },));

}

以上查询导致错误[Semantical Error] line 0, col 80 near 'previousStatuses': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    previousStatuses 关联是 ArrayCollection,所以对于 Doctrine,这个说法是错误的:

    ->where('s.previousStatuses = :status')
    

    where 子句中使用ps 别名,如下所示:

    //...
    return $er->createQueryBuilder('s')
       ->leftJoin('s.previousStatuses', 'ps')
       ->where('ps.id = :status') // <---- here
       ->setParameter('status', $status);
    

    我想Status 实体的status 字段,但这可能是name 或任何其他,请在您的实体中检查。

    【讨论】:

    • 我很困惑.. [Semantical Error] line 0, col 78 near 'status = :st': Error: Class AppBundle\Entity\Status has no field or association named status.. . status 是实体的名称,我可能需要查询 statusId 吗?我很困惑……
    • 我不知道您需要准确比较的属性名称是什么,问题是可能的$status 值是多少?您的实体中与之匹配的属性名称是什么?
    • 好吧,用简单的英语我是说:查找所有具有 $status 的previousStatus 的状态记录...意思是,我可能的下一个状态是什么...连接表基本上将状态映射到可能下一个状态
    • 好吧,如果你 $statusStatus 的一个实例,那么只需使用 where('ps.id = :status') 我只是用它来更新我的答案。
    猜你喜欢
    • 2010-11-11
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2017-02-05
    相关资源
    最近更新 更多