LoginSignup
12
12

More than 5 years have passed since last update.

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

Posted at

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

  • 多対多
  • 他テーブルを経由した多対多
  • 多様対応関係
  • 多対多 多様対応関係

謝辞

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

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12