Ricerca…
Creare un nuovo repository
È possibile creare un nuovo repository dove si desidera, ma è consigliabile crearli in una cartella del Repository
separata.
Mentre è possibile nominare il file e la classe del repository come si desidera, si consiglia di denominare il repository EntityNameRepository
, in modo da poterli trovare rapidamente nella cartella.
Supponiamo di avere un'entità di Project
, memorizzata in AppBundle\Entity
, apparirebbe così:
<?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 qui è la riga @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, perché collega questa Entity con la classe di repository fornita.
Inoltre è necessario utilizzare la classe \Doctrine\ORM\Mapping
per utilizzare le opzioni di mappatura.
Lo stesso repository è piuttosto semplice
<?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();
}
}
?>
È importante notare che la classe Repository deve estendere \Doctrine\ORM\EntityRepository
, in modo che funzioni correttamente. Ora puoi aggiungere tutte le funzioni per le diverse query che desideri.
Funzione ExpressionBuilder IN ()
Se si desidera utilizzare il comando MySQL IN()
in QueryBuilder, è possibile farlo con la funzione in()
della classe 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();
Crea una query con una sottoquery
Ad esempio, solo per dimostrare HOW-TO utilizzare un'istruzione select sottoquery all'interno di un'istruzione select, supponiamo di sapere cosa trovare tutti gli utenti che non hanno ancora compilato l'indirizzo (nessun record esiste nella tabella degli indirizzi):
// 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();