按字段对准则的@OneToMany ArrayCollection进行排序

时间:2019-04-10 08:03:27

标签: symfony entity

最后一个问题是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进行排序。默认情况下我该怎么做?

1 个答案:

答案 0 :(得分:1)

正如我之前的评论中所述,您应该在与基本实体相对应的存储库类中进行自定义查询(您未提供其名称)。

因此,在您的App \ Repository \“ YourBaseENtityName” Repository类中,您将执行以下操作。

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将按名称排序。

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

希望对您有帮助。


编辑: 这是一种为您的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和关系中的标签init并以正确的方式排序。