:::
16-3 儲存並計分
- 修改路由
\專案\routes\web.php,儲存部份用test的控制器TestController來處理:Route::post('/test', 'TestController@store')->name('test.store'); - 先建立考試Test的控制器
php artisan make:controller TestController --resource - 接著編輯控制器
\專案\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()用來轉向到考試結果頁面
- 在上方告知要加上
\App\Test及App\Topic模型use App\Test; use App\Topic; - 路由先定義個
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'); - 接著可以試試看是否能儲存測驗結果囉!(請暫時先到資料庫去看結果)
16-2 產生考試界面
