Doctrine 2 метод фильтра ArrayCollection - PullRequest
57 голосов
/ 01 декабря 2011

Можно ли отфильтровать результаты из коллекции arrayCollection в Doctrine 2 при ленивой загрузке? Например,

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

Мне неясно, как на самом деле используется метод фильтра.

Ответы [ 4 ]

118 голосов
/ 03 сентября 2013

Doctrine теперь имеет Criteria, который предлагает единый API для фильтрации коллекций с помощью SQL и PHP, в зависимости от контекста.

https://www.doctrine -project.org / проекты / Доктрина-ОРМ / о / последняя / ссылка / рабочий-с associations.html # фильтровальной-коллекция

Обновление

Это позволит добиться результата в принятом ответе, не получая все из базы данных.

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); 
  }
}
80 голосов
/ 01 декабря 2011

Ответ Бориса Гери на этот пост может помочь вам: Доктрина 2, запрос внутри сущностей

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

$member->getComments()->filter(
    function($entry) use ($idsToFilter) {
       return in_array($entry->getId(), $idsToFilter);
    }
); 
13 голосов
/ 10 мая 2012

Ваш вариант использования будет:

    $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);
    });
0 голосов
/ 30 августа 2012

Метод Collection#filter действительно загружает всех участников.Фильтрация на уровне SQL будет добавлена ​​в доктрину 2.3.

...