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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow