Posted at

Eloquentでリレーションを作成する方法

More than 5 years have passed since last update.

LaravelについてくるEloquent ORMで、リレーションを新たに作る方法について余り書かれてないのでまとめてみます。


Eloquentのリレーションの種類

Eloquentで使えるリレーションには、主に次の種類があります。全部上げるときりがないので、有名ドコロのみです。


  • BelongsTo

  • HasMany

  • BelongsToMany

それぞれのリレーションの意味はLaravelドキュメントのリレーションの項目を参照してください。


リレーションの作り方

新たにリレーションを作る場合は、リレーションの種類にしたがって、APIを呼び出します。大量にあるAPIな中から、新たにリレーションを作成するのに使いそうなAPIを、APIドキュメントから抜きだしてみました。

リレーション種別
オブジェクト
配列

BelongsTo
associate
--

HasMany
save
saveMany

BelongsToMany
save
saveMany

まとめると簡単ですね。

例として次のモデルを考えます。

class Post extends Eloquent {

public comments() {
return $this->hasMany('Comment');
}
}
class Comment extends Eloquent {
public posts() {
return $this->BelongsTo('Post');
}
}


BelongsTo

BelongsToだけ、associateを使います。

$comment->posts()->associate($post);

一度に複数のエンティティとリレーションを作成する方法は提供されていません。考えて見れば、BelongsToなので、必要ない(というか不可能)です。

ちなみに、

$post = $comment->post;

postをプロパティとしてアクセスすると、関連づいたエンティティを読み込んでくれます。


それ以外のリレーション

それ以外の場合は、saveあるいはsaveManyを使います。ちなみにsaveManyは、内部でsaveを呼び出しているだけです。

ざっくりと見たところ、HasOneなども同じAPIです。

$post->comments()->save($comment);

$post->comments()->saveMany($comments);

同様に

$comments = $post->comments;

とプロパティとしてリレーションをアクセスすると、関連したモデルオブジェクトを(配列として)返してくれます。


関連して

Eloquentのモデル生成法比較:newとcreateというQiitaでは、リレーションを作る場合の注意点を書いてます。