:::
12-8 測驗與題目的關聯
一、從模型設定關聯
- 所謂「關聯」,基本上就是:「順便去撈XX表資料」的意思,所以,一樣可以用
where()或orderBy()之類的方法。 - 從題目(topic)的角度來看,每個題目都有一個所屬(belongsTo)的測驗(exam),所以,開啟題目的模型
/專案/app/Topic.php,加入對測驗的belongsTo關聯:class Topic extends Model { protected $fillable = [ 'topic', 'exam_id', 'opt1', 'opt2', 'opt3', 'opt4', 'ans', ]; public function exam() { return $this->belongsTo('App\Exam'); } } - 其中
App\Exam也可以寫成Exam::class, 自 PHP 5.5 起,關鍵詞 class 也可用於類名的解析。使用類名::class可以得到一個字串,包含了類 ClassName 的完全限定名稱,如:命名空間\類名。 - 此外,方法名稱
exam()之後會變成集合的變數名稱,例如$topic->exam - 從測驗(exam)的角度來看,一個測驗可能會有多(hasMany)題目(topic),所以,開啟使用者的模型
/app/Exam.php,加入對題目的hasMany關聯:class Exam extends Model { protected $fillable = [ 'title', 'user_id', 'enable', ]; protected $casts = [ 'enable' => 'boolean', ]; public function topics() { return $this->hasMany('App\Topic'); } } - 設定好關聯後,在取得
$exam內容時,就會自動加入$exam->topics資料陣列,所以,可以利用「$exam->topics['欄位名稱']」或「$exam->topics->欄位名稱」的方式來取得題目的相關資料。 - 完整關聯請參考:https://laravel-china.org/docs/laravel/5.6/eloquent-relationships/1404
二、修改控制器
- 編輯
/專案/app/Http/Controllers/ExamController.php,修改show()的方法,基本上,就是回到原狀而已,寫法更簡單:public function show(Exam $exam) { return view('exam.show', compact('exam')); }
三、修改樣板
- 修改
/專案/resources/views/exam/show.blade.php,把其中的$topics@forelse ($topics as $key => $topic)改為
$exam->topics即可,如:@forelse ($exam->topics as $key => $topic)
12-7 利用Model查詢資料的方法
