LINUX.ORG.RU

Симфоня

 


0

1

Как в симфони 3 сделать разбивку на страницы? Вроде такой большой фреймворк, а элементарной вещи нет. Ну хотя бы как узнать сколько записей возвращает без limit?
Дергаю запросы как тут https://symfony.com/doc/current/doctrine.html
Простая выборка, таких будет 90%

$products = $em->getRepository('AppBundle:Product')->findBy(["name" => "xxx"], $sort, $limit, $offset);

Возвращает просто массив, а как узнать сколько записей всего вернуло? Везде в примерах используют либо Pagerfanta либо Doctrine\ORM\Tools\Pagination\Paginator но туда идет объект QueryBuilder, а зачем мне QueryBuilder использовать, составлять метровые запросы типа
 $query = $this->getEntityManager()
            ->createQuery('
                SELECT p, a, t
                FROM AppBundle:Post p
                JOIN p.author a
                LEFT JOIN p.tags t
                WHERE p.publishedAt <= :now
                ORDER BY p.publishedAt DESC
            ')
            ->setParameter('now', new \DateTime())

, в чем тогда смыл этой симфони...

★★★★

Ответ на: комментарий от gobot

узнать сколько страниц выводить

Вона чо. Ну тут такое дело, em это контейнер для загруженных entity и само собой он не в курсе сколько вообще записей в базе, поэтому через em это и не узнать. Но, есть ещё EntityPersister, который непосредственно загружает-сохраняет entity и вот там есть метод count($criteria), который делает то что ты хочешь, а также много чего ещё интересного http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.Persisters.Ent...

Тебе нужно добавить в свой класс-репозиторий метод по аналогии с findBy:

    public function countBy(array $criteria)
    {
        $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
        return $persister->count($criteria);
    }

Вообще глянь Doctrine\ORM\EntityRepository чтобы понять как там что делается.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Понятно, уже делаю через QueryBuilder, проще так...

gobot ★★★★
() автор топика
Ответ на: комментарий от no-such-file

Кстати а как посмотреть реальный sql генерируемый. Везде говорят, что нельзя. Это ужасно!

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Везде говорят, что нельзя

Где везде? Вообще-то в QueryBuilder есть метод getSQL().

Если речь про EntityManager, то там да, всё не так просто, потому что нужные запросы составляются при выполнении flush() - определяются какие сущности изменились, добавились и т.п. Узнать конкретные запросы в теории возможно, но на практике это гемор. Да в общем-то всё равно знать их не хочешь - ведь можно посмотреть через дебаг.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 3)
Ответ на: комментарий от no-such-file

getSQL дает не сырой sql, он выдает шаблон, который ещё парсится в execute(). Я вообще не понимаю, неужели трудно было сделать тупо вести лог всех запросов $queryes[] = $q. Как ещё я понял тривиально получить кол-во всех записей(без limit) невозможно. Есть всякие компоненты, но они берут оригинальный запрос, убирают в нем limit и получают кол-во. Вообще удивляюсь я этой симфоней, так распиарена и так бестолкова

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

$query = $em->createQuery('SELECT COUNT(u.id) FROM Entities\User u'); $count = $query->getSingleScalarResult();

$query = $em->createQuery('SELECT u, count(g.id) FROM Entities\User u JOIN u.groups g GROUP BY u.id'); $result = $query->getResult();

Jaberwock ★★★
()
Ответ на: комментарий от gobot

«Есть всякие компоненты, но они берут оригинальный запрос, убирают в нем limit и получают кол-во»

Видимо другие решения не переносимы. Doctrine же о переносимости, то есть о возможности смены СУБД без ущерба для кода.

Jaberwock ★★★
()
Последнее исправление: Jaberwock (всего исправлений: 1)
Ответ на: комментарий от gobot

он выдает шаблон, который ещё парсится в execute()

Он не парсится execute. Он именно в таком виде и кидается в БД и отдельно параметры. https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html Ты прям как с луны свалился.

тривиально получить кол-во всех записей(без limit) невозможно

Чем тебе вариант с countBy не угодил?

Вообще удивляюсь я этой симфоней, так распиарена и так бестолкова

Вообще, отчасти соглашусь, т.к. из коробки много чего нет, приходится искать бандлы, у которых часто либо качество не очень, либо слишком много наворотов (и при этом нет нужных фич, лол). В итоге приходится много пилить с нуля. Поэтому лично я не фанат симфонии.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.