Doctrine 2 de type arraycollection méthode de filtre

puis-je filtrer les résultats d'une collecte de tableaux dans la Doctrine 2 tout en utilisant la charge paresseuse? Par exemple,

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

Je ne sais pas comment la méthode du filtre est réellement utilisée.

52
demandé sur ЯegDwight 2011-12-01 03:11:38

4 réponses

la réponse de Boris Guéry à ce post, peut vous aider: Doctrine 2, requête à l'intérieur d'entités

$idsToFilter = array(1,2,3,4);

$member->getComments()->filter(
    function($entry) use ($idsToFilter) {
       return in_array($entry->getId(), $idsToFilter);
    }
); 
73
répondu FredRoger 2017-05-23 11:46:52

Doctrine a maintenant Criteria qui offre une API unique pour le filtrage des collections avec SQL et en PHP, selon le contexte.

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

mise à Jour

cela permettra d'obtenir le résultat dans la réponse acceptée, sans tout obtenir de la base de données.

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); 
  }
}
106
répondu Ryan 2017-01-02 23:41:20

Votre cas d'utilisation serait :

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

si vous ajoutez ->first() vous obtiendrez seulement la première entrée retourné, ce qui n'est pas ce que vous voulez.

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

    $member->getComments()->filter( function($entry) use ($idsToFilter) {
        return in_array($entry->getId(), $idsToFilter);
    });
12
répondu Stéphan Champagne 2012-05-10 14:22:14

la méthode Collection#filter charge vraiment tous les membres. Le filtrage au niveau SQL sera ajouté dans la doctrine 2.3.

-1
répondu Smoky McPot 2012-08-30 12:25:44