Случайное значение из столбца базы данных, но только один раз в Laravel

#php #mysql #laravel-4

#php #mysql #laravel-4

Вопрос:

Мой запрос к базе данных возвращает случайную строку из базы данных. Есть ли какой-либо способ, когда страница загружается и возвращает эту случайную строку, когда пользователь обновляет страницу, чтобы не изменять строку?

Итак, это мой контроллер

 public function view() {

    $view = View::orderByRaw("RAND()")->limit('1')->get();          

    return View::make('site.view', [
            'view' => $view
        ]);
}
  

И в моем блейде у меня есть

 @foreach($view as $rand) 
  {{ Form::open() }}
      {{ $rand['my_view'] }} 

       // bunch of form fealds
       <button type="submit" class="btn btn-primary">Submit</button>
  {{ Form::clode() }}
@endforeach
  

Итак, здесь пользователь получил случайную строку, и ему нужно заполнить форму и добавить также эту строку. Затем я сохраняю всю информацию в базе данных. Все отлично сохраняется в базе данных. Проблема в том, что пользователь может обновить несколько таблиц времени после отправки формы и может запутаться, когда увидит другую случайную строку…

Ответ №1:

Вариант # 1 — сохраните данные, полученные из View::make сеанса, и верните их:

 public function view() {
    $rand_view = Session::get('rand_view');
    if (!$rand_view) {
        $view = View::orderByRaw("RAND()")->limit('1')->get();

        $rand_view = View::make('site.view', [
            'view' => $view
        ]);

        Session::put('rand_view', $rand_view);
    }
    return $rand_view;
}
  

Вариант # 2 — для конкретного пользователя — всегда генерирует один и тот же «случайный»:

 public function view() {
    // To make sure we generate the same RAND() we generate a random seed for each user and we save that seed in the session for that user.
    $rand_seed = Session::get('rand_seed');
    if (!$rand_seed) {
        $rand_seed = mt_rand();
        Session::put('rand_seed', $rand_seed);
    };

    $view = View::orderByRaw("RAND({$rand_seed})")->limit('1')->get();          

    return View::make('site.view', [
        'view' => $view
    ]);
}
  

Обновить

После некоторой отладки кажется, что вариант # 1 не будет работать, потому View::make что возвращает объект, который нельзя сериализовать. Если вам нужно это решение, используйте вариант # 2

Комментарии:

1. Спасибо за ответ. Мне, конечно, нужен вариант № 1, и я попробовал его, но у меня Exception: Serialization of 'Closure' is not allowed

2. Нужно ли мне изменять цикл foreach в моем представлении? @foreach($view as $rand) ...

3. Извините, в option #1

4. В app/storage/logs/laravel.log nothing нет ничего похожего на empty.. Я удалил текущий журнал и перезагрузил страницу -> эта ошибка 500 не генерирует журнал ошибок

5. Также у меня есть в app/config/app.php: 'debug' => true,

Ответ №2:

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