Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法将一对多关联与原则进行排序_Php_Symfony_Doctrine Orm_Doctrine_Doctrine Extensions - Fatal编程技术网

Php 无法将一对多关联与原则进行排序

Php 无法将一对多关联与原则进行排序,php,symfony,doctrine-orm,doctrine,doctrine-extensions,Php,Symfony,Doctrine Orm,Doctrine,Doctrine Extensions,我遵循有关分拣关联的条令文件: 我有一个类别实体,它有许多文章: class Category { /** * @ORM\OneToMany(targetEntity="App\Entity\Article", mappedBy="category") * @ORM\OrderBy({"position"="ASC"}) */ private $articles; } 物品实体具有用于排序的位置字段: class Article { /*

我遵循有关分拣关联的条令文件:

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

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
    ]);
  }
注意上面,为了避免N+1查询问题,我添加了内部联接和addSelect

在模板中:

{% 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
启用可排序行为后,将向实体附加一个侦听器,以在更新一个条目时更新所有条目的SortablePosition属性,但不会影响查询行为

您必须自己将排序添加到查询中,或使用类中behavior by提供的存储库:

/**
 * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
 */
class Article
{
    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer", nullable=true)
     */
    private $position;
}
然后,您可以通过存储库获得具有预定义顺序的queryBuilder实体将接收别名n:


感谢您的回复,您的解决方案是有效的,我得到了,这应该是sql问题,我只需添加更多的order语句到order结果中就可以了,比如:->orderBy'c.position',ASC'->addOrderBy'a.position',ASC'
$categories = $category->getBySortableGroupsQueryBuilder()->innerJoin('n.articles', 'a');