2011-11-30 16 views
48

¿Puedo filtrar los resultados de una matrizColección en Doctrine 2 mientras uso la carga diferida? Por ejemplo,Doctrine 2 Método de filtro ArrayCollection

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

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

+0

Pero el método aún carga muchos datos, por ejemplo para contar, cargar todos los datos coincidentes. –

Respuesta

66

del respuesta Boris Guery en este post, puede ayudarle a: Doctrine 2, query inside entities

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

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

El único problema con el método de filtro es que tiene que buscar todos los datos antes de poder filtrarlos, ¿sabe si hay alguna forma de hacerlo sin recuperar todo? – Dennis

+0

Hola, estoy intentando lo anterior pero obtengo un error de sintaxis. ¿Puedes actualizar tu respuesta? – Sjwdavies

+0

@Sjwdavies Lo actualicé por ti. Falta() alrededor de $ idsToFilter. – Jrgns

12

su caso de uso sería:

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

si se agrega -> primero() obtendrá solo se devuelve la primera entrada, que no es lo que quieres.

@ Sjwdavies Debe colocar() alrededor de la variable que pasa a USE. También puede acortar como el retorno in_array es un valor lógico ya:

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

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

+1

es esto cierto ahora que 2.3 está fuera? No lo he encontrado en los documentos. ¿Ahora podemos hacer cosas como filtros y otras cosas, esperando que la colección aplique el filtrado a la consulta y difiera la consulta? – Pinetree

+0

@Pinetree Al menos lo dicen: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections – Robin

101

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

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

actualización

Esto va a lograr el resultado en la respuesta aceptada, sin conseguir todo, desde 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); 
    } 
} 
+0

Gracias por aclarar esto, en realidad, se alterará la consulta sql , en lugar de seleccionar todo de la base de datos y luego aplicar un filtro a través de un ciclo. – tftd

+0

http: // stackoverflow.com/questions/35358597/in-predicate-with-criteria-filtering-isnt-working, por favor, mira aquí :) – DonCallisto

+0

Parece haber un problema cuando se usa 'indexBy =" xxx "' en una colección y se llama 'matching 'en él, donde los índices se descartan. https://github.com/doctrine/doctrine2/issues/4693 – fyrye