Doctrine2 и SQL_CALC_FOUND_ROWS

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: Язык PHP

Озадачился проблемой выборки полного кол-ва полученных строк в Doctrine2 используя MySQL выражение SQL_CALC_FOUND_ROWS и оказалось, что сделать это можно, но не каждым из предложенных Doctrine2 способов.

Первым делом я начал гуглить и увидел, что кто-то несколько лет тому назад на хабре делал это используя Doctrine 2 Custom AST Walkers (на гитхабе), но который никак не хочет работать и выдает ошибку. Далее я попробовал сделать так:

$query = $em->createQuery(‘SELECT SQL_CALC_FOUND_ROWS p
FROM AcmeSecurityBundle:Comment p
WHERE p.parentId = 0 AND p.companyId = :companyId’  LIMIT 5
)->setParameter(‘companyId’, $companyId);

$comments1 = $query->getResult();

но не вышло, Doctrine2 просто выругался. А вот следующие варианты прошли на ура:

$stmt = $em->getConnection()->prepare(‘SELECT SQL_CALC_FOUND_ROWS * FROM Comment
WHERE companyId = ‘.(int)$companyId.’ AND parentId = 0 LIMIT 5′);
$stmt->execute();
$comments2 = $stmt->fetchAll();// получаем массив массивов

или

$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addEntityResult(‘\Acme\SecurityBundle\Entity\Comment’, ‘c’);
$rsm->addFieldResult(‘c’, ‘id’, ‘id’);// указываем имя первого поля
$query = $em->createNativeQuery(‘SELECT SQL_CALC_FOUND_ROWS * FROM Comment
WHERE companyId = ? AND parentId = ? LIMIT 5′, $rsm);
$query->setParameters(array($companyId,0));
$comments3 = $query->getResult();// получаем массив объектов

Кстати, оказывается, что на текущий момент (25.10.2014) - Doctrine2 уже поддерживает MySQL-функцию FOUND_ROWS():

$stmt = $em->getConnection()->prepare(‘SELECT FOUND_ROWS()’);
$stmt->execute();
$commentsCount = $stmt->fetchColumn();

Удачи господа и не изобретайте лишних вело-драйверов и лишних Doctrine2-функций.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты