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では、リレーションを作る場合の注意点を書いてます。