Исправление ошибки Not all identifier properties can be found in the ResultSetMapping
Сегодня пол дня потратил на исправлние ошибки, которая возникла после обновления Doctrine 2.1 -> 2.2. В принципе потом все разрешилось благополучно, но мозг как всегда поломать пришлось.
Проблема
Мне в почту свлился тикет с ошибкой вот такого содержания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Not all identifier properties can be found in the ResultSetMapping Файл: /home/www/site.ru/web/lib/Doctrine/ORM/Tools/Pagination/CountOutputWalker.php Строка: 107 #0 /home/www/site.ru/web/lib/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php(38): Doctrine\ORM\Tools\Pagination\CountOutputWalker->walkSelectStatement(Object(Doctrine\ORM\Query\AST\SelectStatement)) #1 /home/www/site.ru/web/lib/Doctrine/ORM/Query/SqlWalker.php(192): Doctrine\ORM\Query\Exec\SingleSelectExecutor->__construct(Object(Doctrine\ORM\Query\AST\SelectStatement), Object(Doctrine\ORM\Tools\Pagination\CountOutputWalker)) #2 /home/www/site.ru/web/lib/Doctrine/ORM/Query/Parser.php(325): Doctrine\ORM\Query\SqlWalker->getExecutor(Object(Doctrine\ORM\Query\AST\SelectStatement)) #3 /home/www/site.ru/web/lib/Doctrine/ORM/Query.php(211): Doctrine\ORM\Query\Parser->parse() #4 /home/www/site.ru/web/lib/Doctrine/ORM/Query.php(241): Doctrine\ORM\Query->_parse() #5 /home/www/site.ru/web/lib/Doctrine/ORM/AbstractQuery.php(647): Doctrine\ORM\Query->_doExecute() #6 /home/www/site.ru/web/lib/Doctrine/ORM/AbstractQuery.php(496): Doctrine\ORM\AbstractQuery->execute(Array, 3) #7 /home/www/site.ru/web/lib/Doctrine/ORM/Tools/Pagination/Paginator.php(148): Doctrine\ORM\AbstractQuery->getScalarResult() #8 [internal function]: Doctrine\ORM\Tools\Pagination\Paginator->count() |
Причем код спотыкался на простейшем запросе. Пару дней назад мы обновили Doctrine, а в её репозитарий прилетел вот такой замечательный pull-request. Разработчик решил переименовать SqlWalker в OutputWalker и сделать ещё ряд работ. ПОдробнее читайте в коммите. Так вот после этого коммита пагинатор работать перестаёт, и вываливается с этой ошибкой. Пришлось файл за файлом смотреть diff’ы и искать в чём может быть подвох.
Подвох обнаружился в том, что ранее строка в методе count() была такая:
1 |
$countQuery->setHint(Query::HINT_CUSTOM_TREE_WALKERS, array('Doctrine\ORM\Tools\Pagination\CountWalker')); |
Теперь же управление идёт по другой ветви в:
1 |
$countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); |
Решение
Чтобы восстановить работу пагинатора достаточно изменить параметр (setUseOutputWalkers()), выбирающий ветку вот так:
1 2 3 |
$paginator = new Paginator($dql); $paginator->setUseOutputWalkers(false); $count = count($paginator); |
После этого работа пагинатора была восстановлена.
Замечу, что если не использовать Doctrine, то и ошибки не было бы 🙂
🙂