Поиск…


Создание нового репозитория

Вы можете создать новый репозиторий, где захотите, но рекомендуется создавать их в отдельной папке Repository .

Хотя вы можете назвать файл и класс репозитория по EntityNameRepository усмотрению, рекомендуется EntityNameRepository репозиторий EntityNameRepository , чтобы вы могли быстро найти их в своей папке.

Предположим, что у нас есть объект Project , который хранится в AppBundle\Entity , он будет выглядеть так:

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

Важной частью здесь является строка @ORM\Entity(repositoryClass="AppBundle\Repository\ProjectRepository") , поскольку она соединяет этот Entity с данным классом репозитория.

Также вам нужно использовать класс \Doctrine\ORM\Mapping для использования параметров сопоставления.

Сам репозиторий довольно прост

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

?>

Важно заметить, что класс Repository должен расширять \Doctrine\ORM\EntityRepository , чтобы он мог работать правильно. Теперь вы можете добавить столько функций для разных запросов, сколько хотите.

Функция ExpressionBuilder IN ()

Если вы хотите использовать команду MySQL IN() в QueryBuilder, вы можете сделать это с помощью функции in() класса 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();

Сделать запрос с суб-запросом

В качестве примера, только для демонстрации HOW-TO использовать оператор выбора подзапроса внутри оператора select, предположим, что мы найдем всех пользователей, которые еще не скомпилировали адрес (в таблице адресов нет записей):

 // 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow