Posted at

Laravelで関連するデータを簡単に操作する

More than 3 years have passed since last update.

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は多くの関連をサポートしています。


  • 多対多

  • 他テーブルを経由した多対多

  • 多様対応関係

  • 多対多 多様対応関係


謝辞

最後まで読んでいただき、まことにありがとうございます。