Recherche…
Créer un nouveau référentiel
Vous pouvez créer un nouveau référentiel où vous voulez, mais il est recommandé de les créer dans un dossier distinct du Repository
.
Bien que vous puissiez nommer le fichier de référentiel et la classe comme vous le souhaitez, il est recommandé de nommer le référentiel EntityNameRepository
, pour que vous puissiez rapidement les trouver dans votre dossier.
Supposons que nous ayons une entité de Project
, stockée dans AppBundle\Entity
, cela ressemblerait à ceci:
<?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 partie importante ici est la ligne @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, car elle connecte cette entité à la classe de référentiel donnée.
Vous devez également utiliser la classe \Doctrine\ORM\Mapping
pour utiliser les options de mappage.
Le dépôt lui-même est assez 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();
}
}
?>
Il est important de noter que la classe Repository doit étendre le \Doctrine\ORM\EntityRepository
pour que cela fonctionne correctement. Vous pouvez maintenant ajouter autant de fonctions que vous le souhaitez pour différentes requêtes.
Fonction ExpressionBuilder IN ()
Si vous souhaitez utiliser la commande MySQL IN()
dans QueryBuilder, vous pouvez le faire avec la fonction in()
de la 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();
Faire une requête avec une sous-requête
Par exemple, uniquement pour démontrer comment utiliser une instruction select de sous-requête dans une instruction select, supposons que nous trouvions tout utilisateur n'ayant pas encore compilé l'adresse (aucun enregistrement n'existe dans la table d'adresses):
// 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();