Sök…
Skapa ett nytt arkiv
Du kan skapa ett nytt arkiv där allt du vill, men det är rekommenderat att skapa dem i ett separat Repository
mapp.
Medan du kan namnge arkivfilen och klassen som du vill, rekommenderas det att namnge repository EntityNameRepository
, till det kan du snabbt hitta dem i mappen.
Låt oss anta att vi har en Project
, lagrad i AppBundle\Entity
, det skulle se ut så här:
<?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
}
?>
Den viktiga delen här är raden @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, eftersom den kopplar denna enhet med den angivna arkivklassen.
Du måste också använda klassen \Doctrine\ORM\Mapping
att använda mappningsalternativen.
Själva förvaret är ganska enkelt
<?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();
}
}
?>
Det är viktigt att lägga märke till att repository-klassen måste utöka \Doctrine\ORM\EntityRepository
, så att den kan fungera korrekt. Nu kan du lägga till så många funktioner för olika frågeställningar som du vill.
ExpressionBuilder IN () -funktion
Om du vill använda MySQL-kommandot IN()
i QueryBuilder kan du göra det med funktionen in()
i klassen 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();
Skapa en fråga med en subfråga
Som exempel, bara för att visa HUR man använder en undervisning för att välja ett uttalande i ett utvald uttalande, anta att vi ska hitta alla användare som ännu inte har kompilera adressen (det finns inga poster i adresstabellen):
// 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();