
laravelのリレーションについて実例を踏まえて詳しく知りたい!
こういった悩みを持っている方への記事です。
筆者は現在Laravelの学習中でして、学習中の気づきやまとめをブログを通してアウトプットしています。
自分自身が開発の最中にハマったところや理解しにくかったところを重点的にピックアップしてまとめています。
今回は、CMSを構築する際の、投稿者(User)と投稿(Post)のリレーションについて解説します。
リレーションの理解があやふやなので、今回学んだ例を取り上げてアウトプットしつつ、理解することが目的です。
5分で読めるので、Laravelのリレーションについて知りたい方は最後まで読んでみてください。
リレーションとは?
「テーブルの関連付け」です。
一つのテーブルに全てのレコードをまとめるのではなく、いくつかのテーブルに分けて管理し互いに関連づける(リレーション)することで、データベースへの無駄なアクセスを削減し、複数のテーブルに跨った情報を効率的に取得できるようになります。
というわけで今回は、例として一人の投稿者(User)に対して複数の投稿(Post)を持つリレーションを想定して実際にコードを見ながら進めていきます。
イメージとしてはこんな感じ↓(??)

①モデルクラスにリレーションを定義
Userモデルにリレーションを定義
Userモデルには、Postモデルに対するリレーションを定義します。
public function posts()
{
return $this->hasMany(Post::class);
}
Userから見てPostは、1対多の関係なので、ここはでhasManyを使います。
Postモデルにリレーションを定義
反対に、Postモデルは多対1の関係になるので、belongsToを使います。
public function user()
{
return $this->belongsTo(User::class);
}
hasManyもbelongsToも英語の意味を考えると理解がしやすいですね。
2つのモデル(テーブル)の関係は、
- Userが主テーブル(外部キーを持たない側のテーブル)
- Postが従テーブル(外部キーによって主テーブルの関連情報を保管している側のテーブル)
になっています。
hasMany()とは?
hasManyは主テーブルのあるレコードに対して、従テーブルの複数のレコードが紐付けるときに用いられるメソッド
HTTPS://QIITA.COM/YUKACHIN0414/ITEMS/726F3CBF4270F50F6028#:~:TEXT=HASMANY%EF%BC%881%E5%AF%BE%E5%A4%9A%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,%E3%81%A8%E3%81%8D%E3%81%AB%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
belongsTo()とは?
belongsToは従テーブルの複数レコードに対して、主テーブルの1つのレコードが紐付けるときに用いられるメソッド
HTTPS://QIITA.COM/YUKACHIN0414/ITEMS/726F3CBF4270F50F6028#:~:TEXT=HASMANY%EF%BC%881%E5%AF%BE%E5%A4%9A%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,%E3%81%A8%E3%81%8D%E3%81%AB%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
②外部キーを追記する
次にcreate_post_tableに外部キーを追記します。
外部キーとは?
外部キーというのは、関連するもう1つのテーブルのレコードIDを保管しておくフィールドのこと
PHP フレームワーク Laravel 入門 p.276
外部キーの作成は、マイグレーションファイルに追記するか、別に追加用のマイグレーションファイルを用意するか、どちらでもいいです。
今回は、前者のマイグレーションファイルにそのまま追記して、再度マイグレーションする流れでやりたいと思います。
②create_post_tableのマイグレーションファイルにuser_idを追記する
create_post_tableのマイグレーションファイルに、外部キーのuser_idを追記します。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->text('content');
$table->integer('user_id'); //<-----これ
$table->timestamp('published_at')->nullable();
$table->timestamps();
$table->foreign('user_id') //foreignメソッドでuser_idを外部キーに設定
->references('id') //referencesメソッドで、従テーブルのuser_idと紐付いている主テーブルのidを指定する。
->on('users'); //onメソッドで主テーブルusersを指定する。
});
}
③php artisan migrate:refreshで再度データを入れ直す
下記コマンドをターミナルで実行し、再度テーブルにデータを入れ直します。
php artisan migrate:refresh
これで、Postテーブルに外部キー制約とPostテーブルとUserテーブルのリレーションの設定が完了しました。
まとめ
今回は、リレーションについて解説しました。
リレーションは設計段階から頻繁に出てくる考え方かと思うので、基本をしっかり押さえた上で応用に生かしていきたいですね。
ご指摘等ございましたら、ご遠慮なくおっしゃっていただけますと幸いです。
参考サイト

