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