Symfony 实体 - 在 ManyToMany 连接中订购连接实体

Symfony Entity - Order joined Entities in a ManyToMany join

假设我们使用 UserTicket class。他们是普通的实体,没什么特别的。

用户 class 包含以下行:

/**
 * @ORM\ManyToMany(targetEntity="Ticket", mappedBy="collaborateurs")
 **/
private $tickets;

票证 class 包含以下内容:

/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="tickets")
 * @ORM\JoinTable(name="users_to_tickets")
 **/
private $collaborateurs;

要获取用户拥有的所有门票,我只需调用 Symfony 创建的 getTickets() 函数即可。尽可能好。 Ticket class 有一些额外的字段,例如 updated 是一个 DateTime 字段或 status 是一个整数。我想按 status DESCupdated DESC

对这些票进行排序

我知道我可以像 findTicketsByUserOrderedByFooBar($user) 那样在存储库中创建一个函数,但我想知道是否有更好的方法。

建议的方法是按照您建议的方式创建函数。

如果您始终希望您的门票按该顺序排列,您可以在关联中设置和orderBy

/**
 * @ORM\ManyToMany(targetEntity="Ticket", mappedBy="collaborateurs")
 * @ORM\OrderBy({"status" = "DESC", "updated" = "DESC"})
 **/
private $tickets;

您可以将 Helper 方法添加到您的用户实体,并 sort/filter 直接在 ArrayCollection 上使用 doctrine2 criteria。像这样:

/**
* this return a ArrayCollection
*/
public function getTicketsByUserOrderedByFooBar()
{
            $criteria = Criteria::create()
                        ->orderBy(array('foo'=>'DESC','bar' =>'ASC'))

        return $this->tickets->matching($criteria);

}


/**
* this return a ArrayCollection
*/
public function getTicketsByUserOrderedBytitle()
{
            $criteria = Criteria::create()
                        ->orderBy(array('title'=>'DESC'))

        return $this->tickets->matching($criteria);

}

另见

希望对您有所帮助。