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.
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);
}
);
Doctrine a maintenant Criteria
qui offre une API unique pour le filtrage des collections avec SQL et en PHP, selon le contexte.
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);
}
}
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);
});
la méthode Collection#filter
charge vraiment tous les membres.
Le filtrage au niveau SQL sera ajouté dans la doctrine 2.3.