web-dev-qa-db-ja.com

Doctrine 2 ArrayCollectionフィルターメソッド

遅延読み込みを使用しているときにDoctrine 2のarrayCollectionから結果を除外できますか?たとえば、

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

フィルターメソッドが実際にどのように使用されているかはわかりません。

57
Dennis

この投稿のBorisGuéryの回答は、あなたを助けるかもしれません: Doctrine 2、エンティティ内のクエリ

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

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

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); 
  }
}
118
Ryan

あなたのユースケースは次のようになります:

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

-> first()を追加すると、最初のエントリのみが返されますが、これは必要なものではありません。

@ Sjwdavies USEに渡す変数を()で囲む必要があります。 in_arrayが既にブール値であるため、短縮することもできます。

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