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