按字段对学说的@OneToMany ArrayCollection 进行排序

Sort a doctrine's @OneToMany ArrayCollection by field

关闭问题是 enter link description here 但我需要更深入的排序:

/**
 * @var ArrayCollection[SubjectTag]
 *
 * @ORM\OneToMany(targetEntity="SubjectTag", mappedBy="subject")
 * @ORM\OrderBy({"position" = "ASC"})
 * @Assert\Valid()
 */
protected $subjectTags;

在 subjectTag 我有:

/**
 * @var ArrayCollection[tag]
 *
 * @ORM\OneToMany(targetEntity="Tag", mappedBy="subject")
 * @ORM\OrderBy({"name" = "ASC"})
 * @Assert\Valid()
 */
protected $tags;

现在我想按 SubjectTag.tags 排序。我该怎么做?

编辑:

Entity1.php: /** * @ORM\ManyToOne(targetEntity="Entity2", referencedColumnName="id", nullable=false) * @Assert\Valid() */ 受保护的 $entity2;

Entity2.php: /** * @ORM\ManyToOne(targetEntity="Entity3", referencedColumnName="id", nullable=false) * @Assert\Valid() */ 受保护的 $entity3;

Entity3.php:

/**
 * @ORM\Column(type="integer", nullable=true)
 */
protected $position;

现在..我想在 Entity1 Entity2 中按位置排序。默认情况下我该怎么做?

正如我之前的评论中所解释的,您应该在您的存储库 class 中执行与您的基础实体相对应的自定义查询(您没有给出它的名称)。

因此,在您的 App\Repository\"YourBaseENtityName" 存储库 class 中,您可以这样做。

public function findOrderByTags()
{
    return $this
        ->createQueryBuilder('baseEntityAlias')
        ->addSelect('st')
        ->addSelect('t')
        ->leftJoin('baseEntityAlias.subjectTags', 'st')
        ->leftJoin('st.tags', 't')
        ->orderBy('st.position', 'ASC')
        ->addOrderBy('t.name', 'ASC')
        ->getQuery()
        ->getResult();
}

另外,根据你的问题,我不确定你想执行什么样的命令。这里 baseEntity->subjectTags 将按其位置排序,然后 baseEntity->subjectTags->tags 将按名称排序。

现在您可以从您的基本实体存储库调用此方法class

希望对您有所帮助。


编辑: 这是一种为您的 queryBuilder 引入默认行为并重用它的方法。

/**
 * In your EntityRepository add a method to init your query builder
 */
public function createDefaultQueryBuilder(string $alias = 'a')
{
    return $this
        ->createQueryBuilder($alias)
        ->addSelect('st')
        ->addSelect('t')
        ->leftJoin('baseEntityAlias.subjectTags', 'st')
        ->leftJoin('st.tags', 't')
        ->orderBy('st.position', 'ASC')
        ->addOrderBy('t.name', 'ASC');
}

/**
 * In this example, I override the default find method. I don't recommend it thought
 */
public function find($id, $lockMode = null, $lockVersion = null)
{
    return $this
        ->createDefaultQueryBuilder()
        ->where('a.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getOneOrNullResult();
}

如您所见,我重用了 createDefaultQueryBuilder 方法,以便在关系中初始化 subjectTags 和标签并以正确的方式排序。