Доктрина 2 Случайный выбор строки (смещение 0 или 1 проиндексировано)? - PullRequest
6 голосов
/ 22 декабря 2011

Пока, я думаю, что в доктрине нет способа выбрать случайную строку.Итак, я думаю, у меня есть запрос, чтобы получить количество строк

// pseudo code
$count = SELECT COUNT(i) FROM Item i WHERE ...

Затем реальный запрос для получения элемента с использованием случайного смещения из PHP, помещенного в setFirstResult

$item = (SELECT i FROM Item WHERE ...)->setMaxResults(1)->setFirstResult(rand(0, $count))->getSingleResult()

Вопрос в том, мой rand() мне начинать с 0 или 1?Тогда конец?$count или $count-1?

Ответы [ 3 ]

6 голосов
/ 22 декабря 2011

setFirstResult() основано на 0.

Следуя вашему подходу, вы должны использовать:

->setFirstResult(rand(0, $count - 1))->setMaxResults(1)->getSingleResult();

Источник:

Я согласен, что документация по этому вопросу неясна. Однако мы можем видеть, что Doctrine \ DBAL \ Query \ QueryBuilder использует его следующим образом:

->modifyLimitQuery($query, $this->maxResults, $this->firstResult);

Который затем переводится в SQL в Doctrine \ DBAL \ Platforms \ AbstractPlatform:

final public function modifyLimitQuery($query, $limit, $offset = null)
{
    ...
    $query .= ' OFFSET ' . $offset;

OFFSET Будучи основанным на 0 в SQL, мы можем вывести, что setFirstResult () также основан на 0.

0 голосов
/ 22 декабря 2011

Независимо от того, начинаете ли вы с 0 или 1, вы должны взять соответствующий конец, чтобы считать и считать -1 соответственно

0 голосов
/ 22 декабря 2011

Я использую в своем приложении:

$item = (SELECT i FROM Item WHERE ...)
    ->setMaxResults($count)
    ->setFirstResult(1)->getSingleResult();

начинают считать от 1 до общего количества записей

...