初めてモデルのリレーションについて触れました。
laravel5.8です
1対多の概念はおそらく理解し、あるユーザーはいくつもドリルを作ることができるようにしました。
User
1id 2name
Drill
1コード 2id 3user_id 4title 5problem0 6problem1 7... 8problem9
2つのモデルの扱い方はなんとなく理解したので、この2つのモデルをもとに4つのモデルでリレーションを作りたいです。
User:Drill 1:多
Category:Drill: 1:多
Problem:Drill 1:1
それぞれのmysqlテーブルのプロパティは
users
1id 2name
drills
1id 2title 3user_id 4category_id
category
1id 2category_name
problems
1id 2drill_id 3problem0 4problem1 5... 6problem9
です。
モデルは
User
1<?php 2 3namespace App; 4 5use Illuminate\Notifications\Notifiable; 6use Illuminate\Contracts\Auth\MustVerifyEmail; 7use Illuminate\Foundation\Auth\User as Authenticatable; 8 9class User extends Authenticatable 10{ 11 use Notifiable; 12 13 /** 14 * The attributes that are mass assignable. 15 * 16 * @var array 17 */ 18 protected $fillable = [ 19 'name', 'email', 'password', 20 ]; 21 22 /** 23 * The attributes that should be hidden for arrays. 24 * 25 * @var array 26 */ 27 protected $hidden = [ 28 'password', 'remember_token', 29 ]; 30 31 /** 32 * The attributes that should be cast to native types. 33 * 34 * @var array 35 */ 36 protected $casts = [ 37 'email_verified_at' => 'datetime', 38 ]; 39 40 public function drills(){ 41 return $this->hasMany('App\Drill'); 42 } 43}
Drill
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Drill extends Model 8{ 9 // protected $fillable = ['title', 'category_name', 'problem0','problem1','problem2','problem3','problem4','problem5','problem6','problem7','problem8','problem9']; 10 protected $fillable = ['title']; 11 12 public function user(){ 13 return $this->belongsTo('App\User'); 14 } 15 16 17 public function category(){ 18 return $this->belongsTo('App\Category'); 19 } 20 21 22 public function problem(){ 23 return $this->hasOne('App\Problems'); 24 } 25} 26
Category
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Category extends Model 8{ 9 protected $fillable = ['category_name']; 10 11 12 public function drills(){ 13 return $this->hasMany('App\Drill'); 14 } 15 16}
Problem
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Problem extends Model 8{ 9 protected $fillable = ['problem0','problem1','problem2','problem3','problem4','problem5','problem6','problem7','problem8','problem9']; 10 11 12 public function drill(){ 13 return $this->belongsTo('App\Drill'); 14 } 15} 16
このような感じです。
アプリケーションで行うCRUD処理は4つのテーブルが常に関係しているようにします。(drillsテーブルにはusersテーブル、categoryテーブルとそれぞれ紐づくuser_id,category_idを与え、drillsテーブルと紐づくdrill_idをproblemsテーブルに与えています。)
二つのモデルだったときのCRUD処理は、二つのusersテーブルとdrillsテーブルが常に関係しているようにして
Auth::user()->drills()->save($drill->fill($request->all())); //登録 Auth::user()->drills()->find($id)->delete(); //消去
で成功しました.
4つのモデルを全て紐付けると、どのようなコードを実行すればいいか分かりません。
例えば、drillのタイトル(title)と、カテゴリー名(category_name)と、問題一覧(problem1,probelm2,...probelm9)と、登録するユーザー名(user_name)を関連づけて登録する場合
上記の4つのモデルで、
Auth::user()->drills()->save($drill->fill($request->all())); //登録
を行うと、General error: 1364 Field 'category_id' doesn't have a default value (SQL: insert into drills
(title
, user_id
, updated_at
, created_at
) values (aaa, 1, 2020-03-19 03:01:58, 2020-03-19 03:01:58))
が出てしまいます。
おそらくcategory_idも紐付けて登録しないといけないのですが、どういったコードで修正できるか分かりません。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー