Доктрина 2 Метод фильтра ArrayCollection



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



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


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

715   4  

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, в зависимости от контекста.

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

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

    $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

    Ничего не найдено.