簡體   English   中英

無法對與教義的一對多關聯進行排序

[英]Cannot sort One-To-Many association with Doctrine

我正在遵循有關排序關聯的理論文檔: 訂購多對多關聯

我有一個類別實體,其中有很多文章:

class Category
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Article", mappedBy="category")
     * @ORM\OrderBy({"position"="ASC"})
     */
    private $articles;

}

文章實體具有一個用於排序的位置字段:

class Article
{
    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer", nullable=true)
     */
    private $position;
}

並從控制器獲取數據:

   /**
   * @Route("/zen", name="zen")
   */
  public function zen(){
    $category = $this->getDoctrine()->getRepository(Category::class);
    $categories = $category->createQueryBuilder('c')
      ->innerJoin('c.articles', 'a')
      ->addSelect('a')
      ->getQuery()->getResult();

    return $this->render('index/zen.html.twig', [
      'categories' => $categories
    ]);
  }

注意,在上面,我添加了內部連接和addSelect以避免N + 1查詢問題。

在模板中:

{% for c in categories %}
    {% for a in c.articles %}
      position: {{a.position}}, id: {{a.id}}
    {% endfor %}
{% endfor %}

結果應按位置排序,例如:

position: 1, id: 2
position: 2, id: 1
position: 3, id: 3
position: 4, id: 4

但實際上是按ID排序的:

position: 2, id: 1
position: 1, id: 2
position: 3, id: 3
position: 4, id: 4

啟用Sortable行為后,它將在實體上附加一個偵聽器以更新所有條目的SortablePosition屬性,但不會影響查詢行為。

您必須自己在查詢中添加順序,或者通過在類中聲明行為來使用行為提供的存儲庫:

/**
 * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
 */
class Article
{
    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer", nullable=true)
     */
    private $position;
}

然后,您可以通過存儲庫獲取具有預定義順序的queryBuilder (實體將獲得別名n ):

$categories = $category->getBySortableGroupsQueryBuilder()->innerJoin('n.articles', 'a');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM