Подтвердить что ты не робот

Как получить случайный ряд laravel-5

В L-4 это было просто:

$random_quote = Quotation::all()->random(1);

Но теперь в L-5 не работает ни один метод, описанный в этом сообщении: Laravel - Красноречивый или Свободный случайный ряд

Мой файл просмотра просто пуст. Любые идеи?

EDIT:

Решено: $ random_quote = Quotation:: orderByRaw ( "RAND()" ) → first();

4b9b3361

Ответ 2

Это работает, но, вероятно, вы не использовали правильный namespace, просто используйте оператор use в верхней части своего class имени:

<?php namespace SomeNamespace;

use App\Quotation; // Says "Quotation.php" is in "App" folder (By default in L-5.0)

class someClass {
    //...
}

Затем вы можете использовать в своем method что-то вроде этого:

// You may add: use DB; at the top to use DB instead of \DB
$random_quote = Quotation::orderBy(\DB::raw('RAND()'))->first();

Или это:

$random_quote = Quotation::orderByRaw("RAND()")->first();

Обновление (так как Laravel - 5.2):

$random_quote = Quotation::inRandomOrder()->first();

Ответ 4

В OrderByRaw ('RAND()') есть 2 проблемы:

  • Он зависит от MySQL-сервера
  • Это может быть медленным на больших таблицах (выборки всех строк)

Вот решение, которое я использовал, что кажется немного лучше:

$cnt = $records->count();
if ($cnt == 0)
    return;

$randIndex = rand(0, $cnt-1);
$obj = $records->skip($randIndex)->take(1)->first();

РЕДАКТИРОВАТЬ: Обратите внимание, что мое решение может быть проблемой (сбой, если не удача) в случае запросов parrallel к базе данных, если некоторые записи удаляются между "count()" и "skip()".

Ответ 5

ОБНОВЛЕНИЕ ДЛЯ LARAVEL 5.3

Я был рад узнать, что теперь это встроенная функция запросов!: D

Метод inRandomOrder может использоваться для сортировки результатов запроса случайным образом. Например, вы можете использовать этот метод для извлечения случайного пользователя:

$randomUser = DB::table('users')
            ->inRandomOrder()
            ->first();

К сожалению, ни один из этих ответов не в полной мере использует коллекции Laravel 5. Если вы пришли сюда из Google, как и я, ища полностью родное решение, посмотрите ниже!

Ответ от Alpha имеет недостаток зависимости базы данных, и Бенджамин, как он отметил, может представлять проблему, когда строки удаляются между ними. Очень маловероятно, но все же возможно.

Здесь существует однострочное решение для выбора случайных строк в Laravel 5 +

// The setup
$numberOfRows = 4;
$models = Model::all(); // or use a ::where()->get();

// And the actual randomisation line
$randRows = $models->shuffle()->slice(0,numberOfRows);

Эт вуаля - счастливая кодировка! Проголосуйте, когда увидите это, чтобы он поднялся на странице:)

Ответ 6

Я бы реализовал это несколько иначе, используя идею Бенджамина. A Область запроса, потому что это кажется уместным, поэтому оно многократно используется, и оно попадает в ваше обычное "Красноречивое" использование.

Примечание: В Eloquent 5.2 встроена поддержка глобальных областей.

Я собираюсь создать черту, которую могут использовать модели, но вы можете просто добавить метод scopeRandom непосредственно к вашей конкретной модели.

/app/GlobalScopes.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

trait GlobalScopes
{
    public function scopeRandom($query){
        $totalRows = static::count() - 1;
        $skip = $totalRows > 0 ? mt_rand(0, $totalRows) : 0;

        return  $query->skip($skip)->take(1);
    }
}

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

/app/Quotation.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Quotation extends Model
{
    use GlobalScopes;

    //...
}

При использовании:

$randomQuote = \Quotation::random()->first();

Ответ 7

В Laravel 5.1 (и Laravel 5.2) существует метод random в классе Collection, возвращаемом конструктором Eloquent.

https://laravel.com/docs/5.1/collections#available-methods

Итак, ваш звонок

$random_quote = Quotation::all()->random(1);

или

$random_quote = Quotation::where('column', 'value')->get()->random(1);

должен работать правильно.

Ответ 8

orderByRaw('RAND()')

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

Ответ 9

Laravel 5.4

1), если нужна одна случайная модель:

$object = Model::all()->random();

2) при необходимости много случайных моделей:

$object = Model::all()->random($n); //$n - number of elements
                                    //$object - collection

Комментарий: вызов $collection- > random (1) теперь возвращает новый экземпляр коллекции с одним элементом. Этот метод будет возвращать только один объект, если аргументы не указаны.

Doc ref: https://laravel.com/docs/5.4/collections#method-random