Szukaj…


Tworzenie nowego repozytorium

Możesz utworzyć nowe repozytorium, gdziekolwiek chcesz, ale zalecane jest utworzenie ich w osobnym folderze Repository .

Chociaż możesz nazwać plik repozytorium i klasę, jak chcesz, zaleca się nazwać repozytorium EntityNameRepository , abyś mógł szybko znaleźć te w swoim folderze.

Załóżmy, że mamy AppBundle\Entity Project , przechowywaną w AppBundle\Entity , wyglądałoby to tak:

<?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
}
    
?>

Ważną częścią tutaj jest wiersz @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository") , ponieważ łączy on ten obiekt z daną klasą repozytorium.

Musisz także użyć klasy \Doctrine\ORM\Mapping aby użyć opcji mapowania.

Samo repozytorium jest dość proste

<?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();
    }
}

?>

Ważne jest, aby zauważyć, że klasa Repository musi rozszerzyć \Doctrine\ORM\EntityRepository , aby mogła działać poprawnie. Teraz możesz dodać tyle funkcji dla różnych zapytań, ile chcesz.

Funkcja ExpressionBuilder IN ()

Jeśli chcesz użyć polecenia MySQL IN() w QueryBuilder, możesz to zrobić za pomocą funkcji in() klasy 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();

Wykonaj zapytanie za pomocą pod-zapytania

Jako przykład, tylko w celu zademonstrowania, w jaki sposób korzystać z instrukcji select podzapytania wewnątrz instrukcji select, załóżmy, że znajdziemy wszystkich użytkowników, którzy jeszcze nie skompilowali adresu (nie ma żadnych rekordów w tabeli adresów):

 // 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();


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow