【问题标题】:Doctrine 2 how to Order By amount of many to many relation?Doctrine 2 如何按多对多关系的数量排序?
【发布时间】:2014-08-02 01:38:44
【问题描述】:

您将如何按与 Doctrine2 的多对多关系的数量进行排序。 我想知道这怎么可能。

如果没有,你有什么建议?我想避免对多个请求进行大量的 foreach。

这是我目前所拥有的:

    $qb = $this->getEntityManager()->createQueryBuilder();

    $qb->select( 'p', 'e', 'un', 'i', 'c' )
        ->from( 'Entity\Event',  'e' )
        ->leftJoin( 'e.place', 'p' )
        ->leftJoin( 'e.userNotified', 'un' )
        ->leftJoin( 'e.invitations', 'i', 'WITH', 'i.friend = :user' )
        ->innerJoin( 'e.categories', 'c', 'WITH', 'c.parent = :cat' )
        ->orderBy('e.dateStart', 'ASC')
        ->setFirstResult( $offset )
        ->setMaxResults( $limit );

我想通过 e.usersNotified 订购。 (多对多关系)。

谢谢各位。

【问题讨论】:

    标签: php symfony doctrine-orm many-to-many dql


    【解决方案1】:

    您可以使用这样的注释来按您的多对多实体排序:

     /**
     * ...
     * @ORM\OrderBy({"some_attribute" = "ASC", "another_attribute" = "ASC"})
     */
    
     private $yourAttribute;
    

    所以你只需对你的属性进行查询,它们已经按照你想要的方式排序了;)

    【讨论】:

    • 感谢查姆利。所以等一下,我需要在我的实体注释中这样做吗?我找不到这方面的参考。
    • 是的,您必须在实体注释中执行此操作。我邀请你看看官方的学说文档:Doctrine DOC
    • 谢谢,我确实重读了它,但我找不到任何他们说我可以按count the amount of relations 对其进行排序的地方。这更像是按年龄或其他排序..
    • 这只会按照给定的顺序对那些相关的实体进行排序,它不会返回由哪个实体具有最多相关实体排序的原始实体。
    【解决方案2】:

    我通常不使用构建器(我更喜欢写出 DQL),但我相信这应该可以工作(我在 DQL 中也有类似的工作)。

    $qb = $this->getEntityManager()->createQueryBuilder();
    
    $qb->select( 'p', 'e', 'un', 'i', 'c', 'COUNT(e) AS HIDDEN counter' )
        ->from( 'Entity\Event',  'e' )
        ->leftJoin( 'e.place', 'p' )
        ->leftJoin( 'e.userNotified', 'un' )
        ->leftJoin( 'e.invitations', 'i', 'WITH', 'i.friend = :user' )
        ->innerJoin( 'e.categories', 'c', 'WITH', 'c.parent = :cat' )
        ->orderBy('e.dateStart', 'ASC')
        ->orderBy('counter ASC')
        ->setFirstResult( $offset )
        ->setMaxResults( $limit );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2011-08-23
      • 2014-08-25
      • 2012-02-20
      • 2020-06-09
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多