Поиск…
Создание нового репозитория
Вы можете создать новый репозиторий, где захотите, но рекомендуется создавать их в отдельной папке 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();