Доктрина 2 Метод фильтра ArrayCollection
могу ли я отфильтровать результаты из коллекции arrayCollection в доктрине 2 при использовании ленивой загрузки? Например,
// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()
Мне непонятно, как на самом деле используется метод фильтра.
4 ответов:
ответ Бориса Гери на этом посту, может помочь вам: доктрина 2, запрос внутри субъектов
$idsToFilter = array(1,2,3,4); $member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); } );
доктрина теперь
Criteriaкоторый предлагает один API для фильтрации коллекций с SQL и в PHP, в зависимости от контекста.обновление
Это позволит достичь результата в принятом ответе, не получая все из базы данных.
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 Вам нужно поместить () вокруг переменной, которую вы передаете для использования. Вы также можете сократить, так как in_array return уже является логическим:
$member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); });
на
Collection#filterметод действительно стремится загрузить все члены. Фильтрация на уровне SQL будет добавлена в доктрине 2.3.
Comments