sorting - the - service knp_paginator not found
¿Hay una manera de especificar un orden predeterminado para un modelo de Doctrine 2? (6)
En Rails (e incluso en Doctrine <2, IIRC) puede especificar un orden predeterminado para cualquier modelo. Por ejemplo, si le dice a Rails que siempre ordene su tabla de customer
por name
, Customer.all
siempre tendrá una lista de los clientes ordenados por name
. Tiene una enorme cantidad de sentido.
Por lo que deduzco, no es posible hacer esto en Doctrine 2. Evidentemente, quieren que crees una consulta en su lugar.
Sería una característica muy SECA, lógica y conveniente de incluir, y una característica extraordinariamente estúpida para elegir dejar de lado, me parece.
Espero sinceramente que me equivoque acerca de que esta opción no existe, y antes de llorar para dormir esta noche, quería comprobar si Doctrine tiene una forma de especificar un orden predeterminado y no he podido. Encuéntralo. ¿Alguien puede iluminarme?
El parámetro 1 de findBy es el criterio de búsqueda, el parámetro 2 está ordenado y parece que debe tomar ASC (ascendente) o DESC (descendente)
$accounts = $this->em->getRepository(''Entities/User'')
->findBy(array(''active'' => 1), array(''email'' => ''ASC''));
Parece que no, no hay manera de especificar un orden predeterminado en Doctrine 2.
Si bien parece que no puede hacer esto para un modelo completo de Doctrine 1, puede especificar el orden como una notación en el lado inverso de una relación:
// Entity/Category
/**
* @var ArrayCollection $posts
*
* @ORM/OneToMany(targetEntity="Post", mappedBy="category")
* @ORM/OrderBy({"name" = "ASC"})
*/
private $posts;
Además, si está implementando servicios de administrador de entidades como los de SonataNewsBundle , puede especificar valores predeterminados a través de argumentos opcionales, es decir
class PostManager extends ModelPostManager
{
/**
* {@inheritDoc}
*/
public function findBy(array $criteria, array $orderBy = array(''name'' => ''asc''))
{
return $this->em->getRepository($this->class)->findBy($criteria, $orderBy);
}
}
Tuve la misma pregunta, encontré que anular la función findAll()
en tu Repositorio funciona bastante bien:
public function findAll()
{
return $this->findBy(array(), array(''lft''=>''asc''));
}
Una forma relativamente simple de lograr esto es anular el método findBy
en la clase de repositorio de la Entidad:
class MyEntityRepository extends EntityRepository
{
/**
* @inheritdoc
*/
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$orderBy = $orderBy === null ? array(''added'' => ''desc'') : $orderBy;
return parent::findBy($criteria, $orderBy, $limit, $offset);
}
}
Esto agrega un orden predeterminado a todos los métodos findBy y le permite anular el ordenamiento si lo necesita. Lo mismo se puede hacer para findOneBy
si es necesario.
$items = $entityManager()->getRepository(''Item'')->findBy(array(),array(''field_to_sort_on''));
Y, por supuesto, puede agregar un método al repositorio de elementos.
public function findAllWithDefaultSort()
{
return $this->findBy(array(),array(''default_field_to_sort_on''));
}
No hay necesidad real de hacer una consulta en este caso. Tenga en cuenta que D2 se enfoca en modelos de objetos con relaciones. Hay un gazillion de alternativas basadas en registros activos por ahí.
Para responder a su pregunta: No.