Eloquentを使って簡単に関連するデータを操作するためには、
- migarationファイルに外部キーを定義
- Eloquentにリレーションを定義
の2つが必要です。
Laravelの公式ドキュメントでもこの2つに関する記述まとまっている記事等がなかったので記述いたします。
状況
UserはEmaiを複数登録できるとします。
この関係をこの関係をテーブルとEloquentに定義します。
migarationファイルに外部キーを定義
親テーブル
親テーブルには特に定義は必要ありません。
create_emails_tables.php
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('username', 64);
$table->string('password', 12);
$table->timestamps();
$table->rememberToken();
});
}
子テーブル
子テーブルに外部キーを定義します。
creat_users_talbes.php
public function up()
{
Schema::create('emails', function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('email', 64)->unique();
$table->string('primary');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
});
}
この例では、user_idカラムがusersテーブルのidカラムを参照していることを宣言しています。これでテーブル間でリレーションを定義することができました。
次は関連したモデルを簡単に操作できるようにする定義です。
Eloquentにリレーションを定義
1対多の関連を定義する
1対多の関連には、hasManyメソッドを使います。
User.php
class User extends Eloquent {
public function emails()
{
return $this->hasMany('Email');
}
}
逆の関連を定義する
Userモデルの関連を逆に定義するには、belongsToメソッドを使います。
Email.php
class Email extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
このように記述することでEloquentを使って簡単にデータを取得することが可能になります。
取得するデータが単数か複数可によってメソッド名も単数と複数を返るようにしてください。
その他の関連
Eloquentは多くの関連をサポートしています。
- 多対多
- 他テーブルを経由した多対多
- 多様対応関係
- 多対多 多様対応関係
謝辞
最後まで読んでいただき、まことにありがとうございます。