プログラミング学習中

【41歳学習中_SAMURAI TERAKOYA】Laravelの基礎を学ぼう#13-19日目

キャンプの後はブログを書く時間で勉強時間に影響が出てる。

それとリレーションシップ難しかった…

この記事はおじさんの勉強メモである

記憶すること!

忘れてはいけない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

難しい…分からなくなったらコチラを参考にする

Qiita

感想

データベースの関係性を構築するだけあって、約束事が多い。

具体例を考えたり、実際に手を動かしてみて覚えていこうと思う。

関係性
1対1hasOnebelongTo
1対多hasManybelongsTo
多対多belongsToManybelongsToMany
モデルで行う関係性構築の為のメッソド定義

若手じゃないけど参考にさせて頂きます!

若手プログラマー必読!ER図の書き方

  • この記事は東京在住の若干雨キャンパーが書きました

ame-sun

1982年生まれ東京都板橋区在住。

キャンプの日は雨が多い気がする。
あ、長男が2014年の大雪の日に生まれてからかも…
お宮参り、お食い初め、GWの旅行、ディズニーランドも…
キャンプ場に到着すると雨が降ってくる…

でも、運命だ。私は若干雨キャンパーでいく!

2021年からブログを始め、細く長く楽しみながら書いていきます。
どうぞ宜しくお願い致します( ̄へ ̄;)ゞ

■こんなブログです
キャンプ場+@(景色、温泉、川遊びなど)の紹介
キャンプ場リスト
高速IC(インターチェンジ)の周辺情報
 (同じIC周辺を都度調べてたので記事にしてみました♪)
キャンプ道具の紹介
子供と行ける遊び場の紹介 など

■キャンプ回数
 2022年 11回

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

-プログラミング学習中