Program Tip

교리 2 ArrayCollection 필터 방법

programtip 2020. 12. 13. 10:27
반응형

교리 2 ArrayCollection 필터 방법


지연 로딩을 사용하는 동안 Doctrine 2의 arrayCollection에서 결과를 필터링 할 수 있습니까? 예를 들면

// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()

필터 방법이 실제로 어떻게 사용되는지 확실하지 않습니다.


이 게시물의 Boris Guéry 답변이 도움이 될 수 있습니다. Doctrine 2, 개체 내부 쿼리

$idsToFilter = array(1,2,3,4);

$member->getComments()->filter(
    function($entry) use ($idsToFilter) {
       return in_array($entry->getId(), $idsToFilter);
    }
); 

Doctrine은 이제 Criteria컨텍스트에 따라 SQL 및 PHP로 컬렉션을 필터링하기위한 단일 API를 제공합니다.

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

최신 정보

이것은 데이터베이스에서 모든 것을 얻지 않고도 받아 들여지는 대답의 결과를 얻을 것입니다.

use Doctrine\Common\Collections\Criteria;

/**
 * @ORM\Entity
 */
class Member {
  // ...
  public function getCommentsFiltered($ids) {
    $criteria = Criteria::create()->where(Criteria::expr()->in("id", $ids));

    return $this->getComments()->matching($criteria); 
  }
}

사용 사례는 다음과 같습니다.

    $ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) {
                        return $user->getActive() === TRUE;
                    });

-> first ()를 추가하면 원하는 것이 아닌 첫 번째 항목 만 반환됩니다.

@ Sjwdavies USE에 전달하는 변수 주위에 ()를 넣어야합니다. in_array return이 이미 부울이므로 단축 할 수도 있습니다.

    $member->getComments()->filter( function($entry) use ($idsToFilter) {
        return in_array($entry->getId(), $idsToFilter);
    });

Collection#filter메서드는 실제로 모든 구성원을 열심히로드합니다. SQL 수준에서의 필터링은 교리 2.3에 추가됩니다.

참고 URL : https://stackoverflow.com/questions/8334356/doctrine-2-arraycollection-filter-method

반응형