교리2 - Symfony에서 Doctrine 일대다 매핑을 사용하여 해당 엔터티 배열을 가져올 때 먼저 정렬하는 방법은 무엇입니까?
给我你的怀抱
给我你的怀抱 2017-05-16 16:43:51
0
2
702

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

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

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

给我你的怀抱
给我你的怀抱

모든 응답(2)
伊谢尔伦

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

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의 소위 속성은 DoctrineCommonCollectionsCollection 인터페이스 구현 인스턴스는 기본적으로 DoctrineCommonCollectionsArrayCollection입니다. 이 인터페이스의 Filtering API(필터링 인터페이스)는 위 솔루션에서 사용됩니다. 위의 경우 필터링된 조건은 결국 성능 최적화를 달성하기 위한 처리를 위해 SQL 레이어로 변환됩니다. 🎜 🎜마지막으로 관련 공식 문서 링크는 다음과 같습니다: Filtering Collections🎜
我想大声告诉你

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

사람:

으아아아

어린이:

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿