Zoeken…
Een nieuwe repository maken
U kunt een nieuwe Repository maken waar u maar wilt, maar het wordt aanbevolen om ze in een afzonderlijke Repository
map te maken.
Hoewel je het Repository-bestand en de klasse naar wens kunt noemen, is het raadzaam om de Repository EntityNameRepository
naam te EntityNameRepository
, zodat je deze snel in je map kunt vinden.
Laten we aannemen dat we een Project
, opgeslagen in AppBundle\Entity
, deze zou er als volgt uitzien:
<?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
}
?>
Het belangrijke deel hier is de regel @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, omdat deze deze entiteit verbindt met de gegeven Repository-klasse.
U moet ook de klasse \Doctrine\ORM\Mapping
gebruiken om de toewijzingsopties te gebruiken.
De repository zelf is vrij eenvoudig
<?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();
}
}
?>
Het is belangrijk op te merken dat de klasse Repository de \Doctrine\ORM\EntityRepository
moet uitbreiden, zodat deze correct kan werken. Nu kunt u zoveel functies voor verschillende zoekopdrachten toevoegen als u wilt.
ExpressionBuilder IN () functie
Als u de opdracht MySQL IN()
in de QueryBuilder wilt gebruiken, kunt u dit doen met de functie in()
van de klasse 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();
Maak een query met een subquery
Als voorbeeld, alleen om aan te tonen hoe een subquery select-instructie in een select-instructie te gebruiken, stel dat we alle gebruikers vinden die het adres nog niet hebben gecompileerd (er bestaan geen records in de adrestabel):
// 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();