Méthode de filtrage Docsortingne 2 ArrayCollection

Puis-je filtrer les résultats d’un arrayCollection dans Docsortingne 2 tout en utilisant le chargement différé? Par exemple,

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

Je ne vois pas comment la méthode de filtrage est utilisée.

La réponse de Boris Guéry à cet article peut vous aider: Docsortingne 2, interroger les entités

 $idsToFilter = array(1,2,3,4); $member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); } ); 

Docsortingne dispose désormais de Criteria qui offrent une API unique pour filtrer les collections avec SQL et PHP, en fonction du contexte.

http://docs.docsortingne-project.org/en/latest/reference/working-with-associations.html#filtering-collections

Mettre à jour

Cela permettra d’atteindre le résultat dans la réponse acceptée, sans obtenir tout de la firebase database.

 use Docsortingne\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); } } 

Votre cas d’utilisation serait:

  $ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) { return $user->getActive() === TRUE; }); 

Si vous ajoutez -> first (), vous ne recevrez que la première entrée retournée, ce qui n’est pas ce que vous voulez.

@ Sjwdavies Vous devez mettre () autour de la variable que vous transmettez à USE. Vous pouvez aussi raccourcir car in_array return est déjà un booléen:

  $member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); }); 

La méthode de Collection#filter charge réellement tous les membres. Le filtrage au niveau SQL sera ajouté dans la docsortingne 2.3.