Доктрина 2: группировка по псевдониму поля (Ошибка: «...» не указывает на класс.) - PullRequest
2 голосов
/ 22 октября 2010

Я получил запрос Doctrine:

        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
        group by first_letter
        order by first_letter asc

Но он выдает исключение с сообщением:

Error: 'first_letter' does not point to a Class. 

Если я пропущу group by и order by,оно работает.

Должен ли я использовать собственный запрос в этом случае или выполнять сортировку и группировку в моем клиентском коде (вероятно, не очень хорошая идея, в зависимости от количества данных в БД ...) или это так?можно заставить этот запрос работать?

Спасибо!

РЕДАКТИРОВАТЬ:

Это мой текущий подход, не очень хороший, но работает на данный момент, так как в БД не так много данных:

    $tmpResult = $this->getEntityManager()->createQuery('
        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
    ')->getResult();

    $groupedAndSortedResult = array();

    foreach($tmpResult as $row) {
        $groupedAndSortedResult[$row['first_letter']] = $row['first_letter'];
    }

    sort($groupedAndSortedResult);

    return array_values($groupedAndSortedResult);

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Я знаю, что вы сами ответили на этот вопрос, но мне просто интересно, пытались ли вы использовать DISTINCT:

select DISTINCT upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e    
order by e.name asc

Заказ по e.name эквивалентен first_letter в этом случае.

1 голос
/ 24 октября 2010

Кажется, что нет хорошего способа сделать это с помощью DQL (по крайней мере, я не смог найти), так как Doctrine всегда пытается сопоставить результат с сущностью.Я закончил делать нативный запрос, используя соединение PDO.Вот код, который я использую в своем хранилище:

    return $this->getEntityManager()->getConnection()->executeQuery('
        select upper(left(tl_exercise.name, 1)) as first_letter
        from tl_exercise
        group by first_letter
        order by first_letter asc
    ')->fetchAll(\PDO::FETCH_COLUMN);

По крайней мере, я избавился от сортировки / группировки в моем клиентском коде.И я могу использовать функцию LEFT(), которая недоступна в DQL по умолчанию (однако вы можете использовать SUBSTRING()).

ОБНОВЛЕНИЕ: есть способ сделать это, используя EntityManager::createQuery и DQL, см. ответ Рохоки

0 голосов
/ 22 октября 2010

Я предполагаю, что first_letter ищет Entity.Это аналогичная проблема в некоторых SQL-запросах, где нельзя использовать вычисляемый атрибут из оператора select в качестве критерия.Попробуйте следующее:

select upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e
group by upper(substring(e.name, 1, 1))
order by upper(substring(e.name, 1, 1)) asc
...