Как пользоваться фильтрами в Symfony2?

Добрый день. По опыту Yii помню были scopes. Какие аналоги в Symfony?
Я делаю выборки товара по таблице с разными условиями с применением сортировок и всевозможных условий на выборке. Но единственное, что должно быть всегда, то выбирать товар count > 0 . Только в админке я мне нужно выбрать без этого условия.
Примеры приветствуются!

Что сделал я .
<?php

namespace Bundle\Repository;

use Doctrine\ORM\EntityRepository;



class ItemRepository extends EntityRepository
{
    public function exist()
    {
       return
            $this->createQueryBuilder('i')
            ->where('i.count > :count')
            ->setParameter(':count', 0);
    }
}


<?php

namespace Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {

        $em = $this->getDoctrine()->getManager('');

    

        $top = $em->getRepository('Bundle:Item')->exist()       
            ->where('i.price > :price')
            ->andWhere('i.rating > :rate')
            ->setParameters(array(':price' => 10000, ':rate' => 3))          
            ->getQuery()
            ->getResult();

        return $this->render('Bundle:Default:index.html.twig', array(
                'top' => $top
            ));
    }
}


Пока ошибка Attempted to call method "createQueryBuilder" on class "Doctrine\ORM\Query". Не получается миксовать.
  • Вопрос задан
  • 3265 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Сделайте QueryBuilder, и в нём сразу поставьте нужное условие. А в каждой странице добавляйте к билдеру дополнительные условия.
Как вариант, создать родительский класс для всех контроллеров, и туда поставить метод, создающий этот QueryBuilder и возвращающий ссылку на него.
Но гораздо лучше будет создать сервис, который инкапсулирует всю работу с сущностью, и сделать у сервиса несколько методов, возвращающих уже готовую сущность, возможно, из кэша.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А в доктрине у вас все выборки должны находиться в вашем репозитории, и там вы уже решаете что как и когда применять и как юзать query builder. То есть если вы хотите взять каких-нибудь данных вы должны взять репозиторий и попросить его дать вам данных. То есть от доктрины будут зависеть только репозитории.

Репозитории можно регистрировать как обычные сервисы:
class: Doctrine\ORM\EntityRepository
factory_service: doctrine.orm.default_entity_manager
factory_method: getRepository
arguments:
     - Acme\CustomerBundle\Entity\Customer


в идеале такие операции как $em->persist тоже стоит делать внутри репозитория а $em->flush вообще во фронт контроллере (перед отдачей респонсов что бы появились id-шки).

Так же у доктрины есть глобальные фильтры как прямой аналог скоупов в Yii но их стоит использовать крайне осторожно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы