Озадачился проблемой выборки полного кол-ва полученных строк в 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-функций.
Комментарии
Комментариев пока нет.