来自数据库列的随机值,但在Laravel中只有一次


Random value from database column but only one time in Laravel

我的数据库查询从数据库返回随机行。是否有任何方法,当页面加载并返回这个随机字符串,当用户刷新页面,不改变字符串?

这是我的控制器

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 -保存从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 -对于特定用户-总是生成相同的"random":

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

只需将随机数据保存到会话变量中,如果会话变量存在,则显示会话变量的内容。当变量不再需要时,不要忘记取消设置。