Buscar..
Creando un nuevo repositorio
Puede crear un nuevo Repositorio donde lo desee, pero se recomienda crearlos en una carpeta de Repository
separada.
Si bien puede nombrar el archivo y la clase del Repositorio como desee, se recomienda nombrar el Repository EntityNameRepository
, para que pueda encontrarlos rápidamente en su carpeta.
Supongamos que tenemos una Entidad de Project
, almacenada en AppBundle\Entity
, se vería así:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Project Entity - some information
*
* @ORM\Table(name="project")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
*/
class Project
{
// definition of the entity with attributes, getters, setter whatsoever
}
?>
La parte importante aquí es la línea @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, porque conecta esta Entidad con la clase de Repository dada.
También debe usar la clase \Doctrine\ORM\Mapping
para usar las opciones de mapeo.
El repositorio en sí es bastante simple.
<?php
namespace AppBundle\Repository;
class ProjectRepository extends \Doctrine\ORM\EntityRepository
{
public function getLastTenProjects()
{
// creates a QueryBuilder instance
$qb = $this->_em->createQueryBuilder()
->select('p')
->from($this->_entityName, 'p')
->orderBy('p.id', 'DESC')
->setMaxResults(10)
;
// uses the build query and gets the data from the Database
return $qb->getQuery()->getResult();
}
}
?>
Es importante tener en cuenta que la clase Repository debe extender \Doctrine\ORM\EntityRepository
para que funcione correctamente. Ahora puede agregar tantas funciones para diferentes consultas como desee.
Función ExpressionBuilder IN ()
Si desea utilizar el comando MySQL IN()
en QueryBuilder, puede hacerlo con la función in()
de la clase ExpressionBuilder .
// get an ExpressionBuilder instance, so that you
$expressionBulder = $this->_em->getExpressionBuilder();
$qb = $this->_em->createQueryBuilder()
->select('p')
->from($this->_entityName, 'p');
->where($expressionBuilder->in('p.id', array(1,2,3,4,5)));
return $qb->getQuery()->getResult();
Hacer una consulta con una sub-consulta
Como ejemplo, solo para demostrar CÓMO usar una instrucción de selección de subconsulta dentro de una instrucción de selección, supongamos que encontramos a todos los usuarios que aún no han compilado la dirección (no existen registros en la tabla de direcciones):
// get an ExpressionBuilder instance, so that you
$expr = $this->_em->getExpressionBuilder();
// create a subquery in order to take all address records for a specified user id
$sub = $this->_em->createQueryBuilder()
->select('a')
->from($this->_addressEntityName, 'a')
->where('a.user = u.id');
$qb = $this->_em->createQueryBuilder()
->select('u')
->from($this->_userEntityName, 'u')
->where($expr->not($expr->exists($sub->getDQL())));
return $qb->getQuery()->getResult();