Номер строки в запросе Symfony Doctrine

Я храню данные о времени круга в базе данных, данные состоят из расстояния, времени, средней скорости и максимальной скорости.

Я пытаюсь отобразить таблицу лидеров, которая показывает десять лучших людей по любому заданному вами запросу (кто продвинулся дальше всего, лучшее среднее время и т. д.). Однако ниже первой десятки я хочу показать пользователю, который авторизовался, позицию в таблице лидеров. Для этого я пытаюсь запустить тот же запрос, упорядочивая результаты и добавляя НОМЕР СТРОКИ, чтобы получить позицию.

Я использую Symfony 1.4 с Doctrine ORM, и я не могу понять, как получить номера строк в запросе. Я знаю, что вы можете сделать это в SQL так:

SELECT full_name, ROW_NUMBER() OVER(ORDER BY distance) AS row_number

Тем не менее, я не могу заставить его работать в Doctrine Symfony.

Есть ли у кого-нибудь идеи о том, как я могу это сделать? (или даже другой способ сделать это)

Заранее спасибо.


person noShowP    schedule 09.06.2011    source источник
comment
На самом деле у меня есть решение для этого, когда я гидратирую результаты в массив, это не самое лучшее, но оно работает. Опубликую, когда переполнение стека позволит мне (7 часов)   -  person noShowP    schedule 09.06.2011


Ответы (1)


Хорошо, вот мое решение:

Я как бы нашел ответ на этот вопрос после еще нескольких экспериментов и сотрудничества.

Что я сделал, так это избавился от выбора и просто вернул упорядоченный список результатов;

$results = self::getInstance()->createQuery('r')
    ->orderBy('r.distance')
    ->execute();

Затем я гидратировал этот результат в массив и использовал array_search(), чтобы найти ключ результата в массиве (к счастью, я возвращаю пользовательские данные здесь, и я знаю пользователя, которого я ищу в массиве)

$index = array_search($user->toArray(), $results->toArray());

Затем я могу вернуть $index + 1, чтобы получить позицию пользователя в таблице лидеров.

Вероятно, есть лучший способ сделать эту сторону базы данных, но я не мог узнать, как это сделать.

Если у кого-то есть лучшее решение, пожалуйста, поделитесь.

person noShowP    schedule 10.06.2011
comment
Это работает, однако вы создаете накладные расходы, используя php, чтобы получить рейтинг. Если ваша база данных очень большая, вы обнаружите проблемы с производительностью. - person Rmannn; 26.10.2012