2016-03-11 6 views
0

У меня есть такой красноречивый запрос, где мне нужно брать случайные строки из таблицы с ограничением, но он возвращает ошибку, когда я использую предел, тогда он тянет только одну строку, независимо от того, какой номер Я принимаю как предел. И когда я не использую ограничение, он возвращает случайное число строк. Не знаю, чего мне не хватает. Это код.Laravel eloquent random query

$questions = $query->whereRaw('RAND()')->take($limit)->get(); 

Заранее благодарен!

+0

Что * $ * предел установлен на уровне? – ggdx

+0

Я принимаю ограничение от запроса, поэтому он не настроен ни на что, но когда я отправляю запрос с лимитом в 10, я получаю только одну строку – Marco

ответ

4

Вы должны были с помощью orderByRaw.

Но есть лучшее решение, вы можете добавить этот макрос:

use Illuminate\Database\Query\Builder; 

Builder::macro('orderByRandom', function() { 

    $randomFunctions = [ 
     'mysql' => 'RAND()', 
     'pgsql' => 'RANDOM()', 
     'sqlite' => 'RANDOM()', 
     'sqlsrv' => 'NEWID()', 
    ]; 

    $driver = $this->getConnection()->getDriverName(); 

    return $this->orderByRaw($randomFunctions[$driver]); 
}); 

Так что вы можете сделать: $query->orderByRandom()->take($limit)->get();

+0

. Я все еще получаю только одну строку, всякий раз, когда у меня есть некоторое значение в пределе. – Marco

+0

Возможно, что-то не так в вашем коде. Правильно ли установлен '$ limit'? Он работает, если вы выполняете запрос вручную? Откуда возникает '$ query', что раньше применялось к нему? –

+0

Да, что-то явно не соответствует пределу $ limit, потому что когда я его устанавливаю вручную, он выполняется правильно, я беру $ limit из запроса, а затем применяю его в запросе – Marco

0

Вы используете RAND в вашем где, кричите быть в ORDER BY

$questions = $query->orderByRaw('RAND()')->take($limit)->get(); 
+0

, это все равно возвращает то же самое – Marco