Подтвердить что ты не робот

Метод фильтрации Doctrine 2 ArrayCollection

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

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

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

4b9b3361

Ответ 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.