34
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

34
39
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
34
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?