IgorPI
@IgorPI

Как получить количество в Doctrine orm?

Как получить количество в Doctrine orm?
На основе ранее созданного DQL
Или другой способ, главное что бы это было экономически выгодно.

public function search()
    {
        $q = $this->request->mixed('q', '');
        $offset = $this->request->mixed('offset', 0);
        $count = $this->request->mixed('count', 10);
        $category_id = (int)$this->request->mixed('category_id', 0);
        $sort = $this->request->mixed('sort', "ASC");

        $dig = 'dig';

        $fields = [
            "$dig.name",
            "$dig.image",
            "$dig.postCode",
            "$dig.phone",
            "$dig.latitude",
            "$dig.longitude",
            "$dig.home",
            "$dig.site",
            "$dig.schedule",
            "$dig.category",
        ];

        $qb = $this->em->getRepository(Digest::class)
            ->createQueryBuilder($dig);

        // join
        if ($category_id > 0)
            $qb = $qb->innerJoin("$dig.category", "cat", Expr\Join::WITH, 'cat.parent = :category_id')
                ->setParameter('category_id', $category_id);


       // where
        $qb = $qb->where("$dig.name like :name")
            ->orWhere("$dig.home like :home")
            ->setParameter("name", "%$q%")
            ->setParameter("home", "%$q%");

        // sort
        $qb  =  $qb->orderBy("$dig.id", $sort)
            ->groupBy("$dig.id");


        // count

        /** @var $qb QueryBuilder $total */
      //$dql = $qb->select("Count($dig.name)")->getDQL();

      $total = 0; // Сюда я хочу записать количество, входящее в условие запроса 
        
        // далее я выставляю лимиты, офсеты

        // limit, offset
        $qb = $qb->setMaxResults($count)
            ->setFirstResult($offset);

        /** @var QueryBuilder $qb */
//        die($qb->getDQL());

        $query = $qb->getQuery();
        $items = $query->getArrayResult();

        $data = new ResponseSchema();
        $data->setCount(count($total));
        $data->setItems($items);
        $json = $this->serializer->serialize($data, 'json', ['attributes' => [
            'count',
            'items' => [
                'name',
                'image',
                'postCode',
                'phone',
                'latitude',
                'longitude',
                'home',
                'site',
                'schedule',
            ]
        ]]);
        $this->response->jsonSend($json);
    }
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
1 СПОСОБ:
вам нужно логику выборки вынести в репозиторий DigRepository в некий метод
там же в репозитории сделать метода для получения количества
все этих методы будут работать с неким общим методом, который возвращает QueryBuilder.
Рекомендую начать с этого способа

2 СПОСОБ:
Сделать некий объект Criteria, который бы собирал нужный QueryBuilder и отдавал нужный ответ (сами данные или их число)

ПРЯМОЙ ОТВЕТ:
Вам нужен еще один запрос почти с тем же набором для QueryBuilder, только запрашивать $qb->select('count($dig.id)')
И в конце $qb->getQuery()->getSingleScalarResult()

Потому и предложил выше вынести код туда, где ему место и сделать его более общим, чтобы можно и поиск делать и запрашивать количество записей

Экономически -- так и так делать 2 запроса, но зато код проще станет и удобнее будет его переиспользовать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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