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)