投稿者と投稿をリレーション【Laravel】

Laravel

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テーブルのリレーションの設定が完了しました。

まとめ

今回は、リレーションについて解説しました。

リレーションは設計段階から頻繁に出てくる考え方かと思うので、基本をしっかり押さえた上で応用に生かしていきたいですね。

ご指摘等ございましたら、ご遠慮なくおっしゃっていただけますと幸いです。

参考サイト

外部キーについて(MySQL編) - Laravel学習帳
【Laravel】リレーション後に外部キー設定を行う - Qiita
リレーションと外部キー 以前、リレーションの作業を行なった。 【Laravel入門】リレーションとユーザーの一覧表示 そして、動作確認のためユーザーの削除を行ってみたが、予想と違う結果となった。自分の予想ではこうなるはずだった...
初めてのLaravel ⑥。外部キー制約の使い方 | N-blog
この記事はこんな悩みを解決します外部キー制約って何?複数のテーブルを連動させる方法が知りたいLaravelでデータベースを扱う基本を学びたいデータベースを使っていると複数のテーブルを連動させて使用したい、という事があるかと思います。例えば、…