最后一个问题是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进行排序。默认情况下我该怎么做?
答案 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并以正确的方式排序。