Suche…
Ein neues Repository erstellen
Sie können ein neues Repository an beliebigen Orten erstellen. Es wird jedoch empfohlen, sie in einem separaten Repository
Ordner zu erstellen.
Sie können zwar die Repository-Datei und die Klasse nach EntityNameRepository
, es wird jedoch empfohlen, das Repository EntityNameRepository
zu EntityNameRepository
, damit Sie diese schnell in Ihrem Ordner finden können.
Nehmen wir an, wir haben ein Project
AppBundle\Entity
, das in AppBundle\Entity
gespeichert ist. Es würde so aussehen:
<?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
}
?>
Der wichtige Teil hier ist die Zeile @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository")
, da diese Entität mit der angegebenen Repository-Klasse verbunden wird.
Sie müssen auch die Klasse \Doctrine\ORM\Mapping
, um die Mapping-Optionen verwenden zu können.
Das Repository selbst ist ziemlich einfach
<?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();
}
}
?>
\Doctrine\ORM\EntityRepository
Sie, dass die Repository-Klasse das \Doctrine\ORM\EntityRepository
, damit es ordnungsgemäß funktionieren kann. Jetzt können Sie beliebig viele Funktionen für verschiedene Abfragen hinzufügen.
Funktion ExpressionBuilder IN ()
Wenn Sie den MySQL-Befehl IN()
im QueryBuilder verwenden möchten, können Sie dies mit der in()
Funktion der ExpressionBuilder- Klasse tun.
// 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();
Machen Sie eine Abfrage mit einer Unterabfrage
Als Beispiel: Verwenden Sie nur zum Veranschaulichen von HOW-TO eine Unterabfrage select-Anweisung innerhalb einer select-Anweisung. Nehmen Sie an, wir suchen alle Benutzer, die noch nicht die Adresse kompilieren (in der Adressentabelle sind keine Datensätze vorhanden):
// 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();