不能对与教义的一对多关联进行排序



我正在遵循有关排序关联的学说文档:对多关联进行排序

我有一个类别实体,它有很多文章:

class Category
{
/**
* @ORMOneToMany(targetEntity="AppEntityArticle", mappedBy="category")
* @ORMOrderBy({"position"="ASC"})
*/
private $articles;
}

文章实体具有用于排序的位置字段:

class Article
{
/**
* @GedmoSortablePosition
* @ORMColumn(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
]);
}

注意上面,我添加内部连接并添加选择以避免 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属性,但不会影响查询行为。

您必须自己将排序添加到查询中,或者通过在类中声明该行为来使用行为提供的存储库:

/**
* @ORMEntity(repositoryClass="GedmoSortableEntityRepositorySortableRepository")
*/
class Article
{
/**
* @GedmoSortablePosition
* @ORMColumn(name="position", type="integer", nullable=true)
*/
private $position;
}

然后,您可以通过存储库获取具有预定义顺序的queryBuilder(实体将收到别名n(:

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

相关内容

  • 没有找到相关文章

最新更新