#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:
Просто сохраните случайные данные в переменной сеанса, чтобы отобразить содержимое переменной сеанса, если она присутствует. Только не забудьте сбросить переменную, когда она больше не нужна.