キャンプの後はブログを書く時間で勉強時間に影響が出てる。
それとリレーションシップ難しかった…
この記事はおじさんの勉強メモである
記憶すること!
忘れてはいけないMVCで使用するフォルダとファイル
■ルート
routes\web.php
■コントローラー
app\Http\Controllers\○○○.php
■ビュー
resources\views\○○○.blade.php
■モデル
app\Models\○○○.php
■マイグレーション
database\migrations\〇〇〇〇〇〇〇_〇〇_create_products_table.php
18章 リレーションシップについて学ぼう
データベースの操作のために作成したモデルで、テーブルの関係性(1対1、1対多、多対多)を構築する。
AとBが1対1
Bが外部キーとしてAのキーを保有する。Bの外部キーは重複しない
BはAの部分集合。B⊆Aってこと?
テラコヤでは、市民(A)とパスポート(B)のように、パスポートで保有している市民IDは市民のキーを保有している
社員(A)と社員証(B)の関係とか、社員証にはかならず社員番号がある
個人(A)とマイナンバー(B)の関係とか、個人にはかならずマイナンバー(個人番号)がある
関係構築するには
関係構築するにはモデルで各メソッドを以下のように定義する。
A(一)にはhasOne
B(多)にはbelongTo
例えば、個人(A)とマイナンバー(B)の関係だと。
★個人モデル
class Kojin extends Model {
// 1人の個人は1つのマイナンバーを持つ
public function Mynumber() {
return $this->hasOne(Mynumber::class); ←これで関係構築
}
}
★マイナンバーモデル
class Mynumber extends Model {
// 1人の市民は1つのパスポートを持つ
public function Kojin() {
return $this->belongTo(Kojin::class); ←これで関係構築
}
}
あれ、カラムの設定は?
カラムを指定しなくてもLaravel側でキーを推測してくれる
外部キーと参照先のカラム名を任意に指定する場合は、以下のように引数を指定すれば良い
hasOne(モデル名::class, '外部キー', '参照先のカラム名')
belongTo(モデル名::class, '外部キー', '参照先のカラム名')
AとBが1対多
Bが外部キーとしてAのキーを保有する。Bの外部キーは重複してもよい
BはAの部分集合。B⊆A
テラコヤでは、母親(A)と子供(B)のように、子供で保有している母親IDは母親のキーを保有している。
子供を母親が複数生んだ場合、子供(B)が保有する母親IDは重複するが1対多の関係なので問題なし
作者(A)と著書(B)の関係とか、著書にはかならず作者がいる。
チーム(A)と試合結果(B)の関係とか、試合結果にはかならずチームがある。
関係構築するには
関係構築するには各メソッドを以下のように定義する
AにはhasMany
BにはbelongTo
例えば、チーム(A)と試合(B)の関係だと。
★チームモデル
class Team extends Model {
// 1人のチームは多数の試合を持つ
public function Game() {
return $this->hasMany(Game::class); ←これで関係構築
}
}
★試合モデル
class Game extends Model {
// 1人の試合は1つのチームを持つ
public function Team() {
return $this->belongTo(Team::class); ←これで関係構築
}1
}
AとBが多対多
多対多の関係には中間テーブルが必要
中間テーブルには命名規則がある
テラコヤでは、学生(A)と講座(B)のように、多対多となってしまう関係には中間テーブルを間に作成している
恐らくファーストフードのメニュー(A)とセットメニュー(B)の関係とか、セットメニューが構成には必ず単品メニューがあるよね
裏メニューとかは?
関係構築するには
関係構築するには各メソッドを以下のように定義する
AにはbelongsToMany
BにはbelongsToMany
例えば学生(A)と講座(B)の関係だと。
★学生モデル
class Student extends Model {
// 1人の学生は複数の講座を受講できる
public function courses() {
return $this->belongsToMany(Course::class); ←これで関係構築
}
}
★講座モデル
class Course extends Model {
// 1つの講座は複数の学生に受講される
public function students() {
return $this->belongsToMany(Student::class); ←これで関係構築
}
}
中間テーブルの命名規則
・2つのテーブルをアルファベット順に並べる。(例:classes→students)
・2つのテーブルを単数形にして_
でつなげる。(例:class_student)
★マイグレーションファイルの作成
php artisan make:migration create_class_student_table --create=class_student
難しい…分からなくなったらコチラを参考にする
感想
データベースの関係性を構築するだけあって、約束事が多い。
具体例を考えたり、実際に手を動かしてみて覚えていこうと思う。
関係性 | A | B |
---|---|---|
1対1 | hasOne | belongTo |
1対多 | hasMany | belongsTo |
多対多 | belongsToMany | belongsToMany |
若手じゃないけど参考にさせて頂きます!