찾다

 >  Q&A  >  본문

교리2 - Symfony에서 Doctrine 일대다 매핑을 사용하여 해당 엔터티 배열을 가져올 때 먼저 정렬하는 방법은 무엇입니까?

1인(Person), 여러 자녀(Children) 등 일대다 매핑에 Doctrine을 사용하고 있습니다. Doctrine을 사용하여 Children을 자동으로 얻을 때 자녀를 연령별로 정렬할 수 있기를 바랍니다.

실례합니다: 이를 달성하려면 어떤 함수를 오버로드해야 합니까? persion->SQL 쿼리를 수행하기 위해 getChildren()이 호출하는 함수는 무엇입니까?

이렇게 필요한 결과를 찾기가 어렵습니다. 조언 부탁드립니다.

给我你的怀抱给我你的怀抱2757일 전674

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-05-16 16:45:51

    해결책은 다음과 같습니다.

    Person 클래스의 getChildren 메소드를 수정하세요Person类的getChildren方法

    <?php
    // src/AppBundle/Entity/Person.php
    // ...
    
    use Doctrine\Common\Collections\Criteria;
    
    //...
    
        /**
         * @param string $orderedByAge "ASC"|"DESC"
         */
        public function getChildren($orderedByAge=null)
        {
            if (null === $orderedByAge) {
                return $this->children;
            }
            
            if (!in_array(strtoupper($orderedByAge), ['ASC', 'DESC'])) {
                throw new \InvalidArgumentException('参数错误,必须是"ASC"或"DESC"中的一个');
            }
            
            $order = 'ASC' === $orderedByAge ? Criteria::ASC : Criteria::DESC;
            
            $criteria = Criteria::create()->orderBy(['age' => $order]);
            
            return $this->children->matching($criteria);
        }
        
    // ...

    如果不想修改getChildren方法,可以写一个新的方法getChildrenOrderedByAge,道理同上。

    总结:

    Doctrine的一对多或者多对多关系中,Entity中所谓的属性是DoctrineCommonCollectionsCollection接口的某一实现的实例,默认情况下是DoctrineCommonCollectionsArrayCollection,上述解决方案中用到的就是这一接口的Filtering API(筛选接口),上述情况下,筛选的条件会最终转化到SQL 으아아아

    getChildren 메소드를 수정하고 싶지 않다면 위와 같은 이유로 새로운 메소드 getChildrenOrderedByAge를 작성하면 됩니다.

    요약:🎜 🎜Doctrine의 일대다 또는 다대다 관계에서 Entity의 소위 속성은 < code>DoctrineCommonCollectionsCollection 인터페이스 구현 인스턴스는 기본적으로 DoctrineCommonCollectionsArrayCollection입니다. 이 인터페이스의 Filtering API(필터링 인터페이스)는 위 솔루션에서 사용됩니다. 위의 경우 필터링된 조건은 결국 성능 최적화를 달성하기 위한 처리를 위해 SQL 레이어로 변환됩니다. 🎜 🎜마지막으로 관련 공식 문서 링크는 다음과 같습니다: Filtering Collections🎜

    회신하다
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 16:45:51

    @vinzao의 방법을 사용해도 괜찮지만 Doctirne에서는 OrderBy 방법을 제공합니다.

    사람:

    으아아아

    어린이:

    으아아아

    회신하다
    0
  • 취소회신하다