Doctrine 2 ArrayCollection filter method

Can I filter out results from an arrayCollection in Doctrine 2 while using lazy loading? For example,

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

It's unclear for me how the filter method is actually used.


The Boris Guéry answer's at this post, may help you: Doctrine 2, query inside entities

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

    function($entry) use ($idsToFilter) {
       return in_array($entry->getId(), $idsToFilter);

Doctrine now has Criteria which offers a single API for filtering collections with SQL and in PHP, depending on the context.


This will achieve the result in the accepted answer, without getting everything from the database.

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); 

Your use case would be :

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

if you add ->first() you'll get only the first entry returned, which is not what you want.

@ Sjwdavies You need to put () around the variable you pass to USE. You can also shorten as in_array return's a boolean already:

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

The Collection#filter method really does eager load all members. Filtering at the SQL level will be added in doctrine 2.3.

Need Your Help

How to reload .bash_profile from the command line?

bash shell .bash-profile

How can I reload .bash_profile from the command line?