:::

12-8 測驗與題目的關聯

一、從模型設定關聯

  1. 所謂「關聯」,基本上就是:「順便去撈XX表資料」的意思,所以,一樣可以用where()orderBy()之類的方法。
  2. 從題目(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');
        }
    }
  3. 其中App\Exam也可以寫成Exam::class, 自 PHP 5.5 起,關鍵詞 class 也可用於類名的解析。使用 類名::class 可以得到一個字串,包含了類 ClassName 的完全限定名稱,如:命名空間\類名
  4. 此外,方法名稱exam()之後會變成集合的變數名稱,例如$topic->exam
  5. 從測驗(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');
        }
    }
  6. 設定好關聯後,在取得 $exam 內容時,就會自動加入 $exam->topics資料陣列,所以,可以利用「 $exam->topics['欄位名稱']」或「 $exam->topics->欄位名稱」的方式來取得題目的相關資料。
  7. 完整關聯請參考:https://laravel-china.org/docs/laravel/5.6/eloquent-relationships/1404

二、修改控制器

  1. 編輯 /專案/app/Http/Controllers/ExamController.php,修改 show() 的方法,基本上,就是回到原狀而已,寫法更簡單:
    public function show(Exam $exam)
    {
        return view('exam.show', compact('exam'));
    }

三、修改樣板

  1. 修改 /專案/resources/views/exam/show.blade.php ,把其中的$topics
    @forelse ($topics as $key => $topic)

    改為$exam->topics即可,如:

    @forelse ($exam->topics as $key => $topic)

到GitHub觀看此單元程式異動


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D37%26tbdsn%3D1183

計數器

今天: 1503150315031503
昨天: 1416141614161416
總計: 7340150734015073401507340150734015073401507340150