:::

16-3 儲存並計分

  1. 修改路由\專案\routes\web.php,儲存部份用test的控制器TestController來處理:
    Route::post('/test', 'TestController@store')->name('test.store');
  2. 先建立考試Test的控制器
    php artisan make:controller TestController --resource
  3. 接著編輯控制器 \專案\app\Http\Controllers\TestController.php,修改 store 方法,儲存後轉向到考試結果頁面。
    public function store(Request $request)
    {
        $content = collect($request->ans)->toJson();
        $score = 0;
        foreach ($request->ans as $topic_id => $ans) {
            $topic = Topic::find($topic_id);
            $score += ($topic->ans == $ans) ? 20 : 0;
        }
    
        $test = Test::create([
            'content' => $content,
            'user_id' => $request->user_id,
            'exam_id' => $request->exam_id,
            'score' => $score,
        ]);
        return redirect()->route('test.show', $test->id);
    }
    • $request 就是使用者輸入的內容,以物件方式存在。詳情可參考:https://laravel-china.org/docs/laravel/5.6/requests/1297#7ecd03
    • 其中$content將會以json格式來儲存題號以及使用者填寫的答案,而$request->ans是所有填答的陣列,可以用json_encode($request->ans)這個PHP內建函數來將之轉成json格式,也可以利用Laravel的collect()來將陣列轉為集合,以便用集合的toJson方法。
    • 關於集合可用的所有方法可以參考:https://laravel-china.org/docs/laravel/5.6/collections/1388
    • 這裡一樣用fillable方式來寫入資料,所以記得查看\專案\app\Test.php有沒有進行fillable設定
    • redirect() 用來轉向到考試結果頁面
  4. 在上方告知要加上 \App\TestApp\Topic模型
    use App\Test;
    use App\Topic;
  5. 路由先定義個test.show的路由,避免錯誤。
    Route::pattern('exam', '[0-9]+');
    Route::pattern('topic', '[0-9]+');
    Route::pattern('test', '[0-9]+');
    //略
    Route::get('/test/{test}', 'TestController@show')->name('test.show');
    
  6. 接著可以試試看是否能儲存測驗結果囉!(請暫時先到資料庫去看結果)

到GitHub觀看此單元程式異動


:::

書籍目錄

展開 | 闔起

https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D1192%26tbsn%3D37

計數器

今天: 617617617
昨天: 2027202720272027
總計: 7971658797165879716587971658797165879716587971658