はじめに
情報共有サイトにおいて、全てのユーザーが投稿した記事を取得することは簡単ですが、特定のユーザーが投稿した記事のみを取得したいとなると、リレーションが必要になり、初学者にとってはちょっと複雑になります。本記事では備忘録も兼ねてその手順をメモします。
テーブルの作成
テーブル名を決める
テーブル名は複数形にします
今回は下記のように定義します。
- 記事を保存するテーブル名→news
- ユーザー情報を保存するテーブル名→users
マイグレーションファイルの作成
下記コマンドを打ちます
$ php artisan make:migration create_テーブル名_table
database/migrationsディレクトリ直下にテーブル名.php というファイルが生成されます。
マイグレーションファイルへの編集
newsテーブルに記事のタイトルと本文のカラムを加える場合、下記のように'title'と'body'を追記します。
public function up()
{
Schema::create('news', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title'); // ニュースのタイトルを保存するカラム
$table->string('body'); // ニュースの本文を保存するカラム
$table->timestamps();
});
}
変更を反映させる為には、下記コマンドを実行します。
このコマンドはマイグレーションファイルのup関数を実行します。
php artisan migrate
モデルの作成
モデルとは簡単に言うとテーブル内のデータを操作でき、保存、編集、削除などが出来るものになります。
テーブルとモデルの紐付け
- Laravelでは1つのテーブルにつき1つのモデルが紐づきます。
- テーブルとモデルは命名規則で紐づけられます。テーブル名の単数形をモデル名にしてモデル名の頭文字を大文字にすることで紐づけられます。 例えば下記のようになります。
テーブル名 | モデル名 |
---|---|
news | News |
users | User |
モデルの作成
Newsモデルを作成するには下記コマンドを実行します。
php artisan make:model News
appディレクトリ直下にNews.php というファイルが生成されました。
同様にUserモデルも作成します。
ここまでで、ユーザー情報に関するusersテーブル/Userモデルと、記事情報に関するnewsテーブル/Newsモデルを作成しました。これでそれぞれの情報を個々に取得することはできます。しかしある特定のユーザーが投稿した記事を全て取得したいとなるとこのままでは難しいです。これを解決するにはnewsテーブルにusersテーブルのidを加えてあげる必要があります。このnewsテーブルに追加するusersテーブルのidを外部キーと呼びます。
外部キーにも命名規則があります。
usersテーブルのidカラムを外部キーとして設定する場合、リレーション先のカラム名は[リレーション元モデル名_id]となり、'user_id'と設定します。
テーブルにカラムを追加する手順
テーブルにカラムを追加する方法としては、テーブル自体を削除して作り直すやり方もあるのですが、これでは保存したデータが消えてしまう問題があります。そこで今回は別の方法でカラムを追加します。詳しいことは下記記事が参考になります。
【Laravel】カラムを追加する方法
下記コマンドでカラムを追加するための専用のmigrationファイルを作成します。
php artisan make:migration add_user_id_to_news_table --table=news
--table=news:ここにカラムを追加するテーブル名を書きます。
作成されたmigrationファイルを編集します。
public function up()
{
Schema::table('news', function (Blueprint $table) {
$table->integer('user_id');
});
}
public function down()
{
Schema::table('news', function (Blueprint $table) {
$table->dropColumn('user_id');
});
}
変更を反映させます。
php artisan migrate
モデルの紐付け
外部キーによってテーブル間の紐付けができたら次にモデル間の紐付けをします。
テーブル間の関係が '1対他' か '他対1' かによって使用するメソッドが下記のようになります。
- [1対他]のリレーション → hasManyメソッド
- [他対1]のリレーション → belongsToメソッド
今回はusersテーブルとnewsテーブルの関係は[1対他]になり、それぞれのメソッドは下記のように扱います。
- newsテーブルを扱うNewsモデルではbelongsToメソッド
- usersテーブルを扱うUserモデルではhasManyメソッド
それぞれのメソッドはモデル内で下記のように記入します。
Newsモデル
public function user()
{
return $this->belongsTo('App\User');
}
Userモデル
public function news()
{
return $this->hasMany('App\News');
}
これで特定のユーザーの記事を取得することができます。