遅延読み込みを使用しているときにDoctrine 2のarrayCollectionから結果を除外できますか?たとえば、
// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()
フィルターメソッドが実際にどのように使用されているかはわかりません。
この投稿のBorisGué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を提供します。
更新
これにより、データベースからすべてを取得することなく、受け入れられた回答で結果が得られます。
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が既にブール値であるため、短縮することもできます。
$member->getComments()->filter( function($entry) use ($idsToFilter) {
return in_array($entry->getId(), $idsToFilter);
});