lazy orm doctrine2 lazy-loading arraycollection

orm - lazy - doctrine eager



Método del filtro Doctrine 2 ArrayCollection (4)

¿Puedo filtrar los resultados de un arrayCollection en Doctrine 2 mientras uso la carga diferida? Por ejemplo,

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

No está claro cómo se utiliza realmente el método de filtro.


Doctrine ahora tiene Criteria que ofrecen una única API para filtrar colecciones con SQL y en PHP, según el contexto.

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

Actualizar

Esto logrará el resultado en la respuesta aceptada, sin obtener todo de la base de datos.

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


El método de Collection#filter realmente carga con entusiasmo a todos los miembros. El filtrado a nivel de SQL se agregará en la doctrina 2.3.


La respuesta de Boris Guéry en este post puede ayudarte: Doctrina 2, consulta dentro de las entidades.

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


Su caso de uso sería:

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

si agrega -> first () solo obtendrá la primera entrada devuelta, que no es lo que desea.

@ Sjwdavies Debe colocar () alrededor de la variable que pasa a USE. También puede acortar ya que in_array return es un booleano ya:

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