【Laravel5】EloquentでManyToMany

【Laravel5】EloquentでManyToManyを実現する Sakura

【Laravel5】EloquentでManyToManyのリレーション

こちらのサイトのまとめです。

Many to Many Relations (With Tags) – Laravel5 Fundamentals

GitHubにサンプルプロジェクトがあります。

ryo-ogata/learning-laravel-5

はじめに

記事(Webページ)を想像してください。記事(Article)には投稿したユーザー(User)がいて、ユーザーと記事は1対多(OneToMany)の関係にあります。記事にはタグをつけることができるでしょう。記事とタグは、多対多(ManyToMany)の関係にあります。今回はこの多対多(ManyToMany)をEloquentをつかって実装したいと思います。

Tagモデルを実装する

  1. 記事モデルを編集する
    • Article.php

      Articleモデルに対して、Tagモデルは多対多であるため、以下のようにtags()メソッドを追加します。

  2. Tagモデルを追加する。

    コマンドラインから追加します。

  3. Tagテーブルのマイグレーションを追加する。

    コマンドラインから追加します。引数にテーブル名を指定すると簡単なコード付きで出力します。

    テーブル定義を編集します。

    • database/migrations/[yyyy_MM_dd_HHmmss]_create_tags_table.php

    書き終えたら、コマンドラインから実行してテーブルを作成しておきます。

    MySQLから確認するとこのようになります。

ArticleとTagを紐付けて取得する

  1. Tagレコードを追加する

    コマンドラインから確認します。

  2. ManyToManyを試す

    コマンドラインから確認します。

  3. 動作を確認する

    この状態からさらに以下のコマンドを打つと、tagsにも値が入った状態になっています。

  4. Tagモデルから取得する方法も試す

    "pivot"の中で、TagモデルとArticleモデルのidが紐付いているのが確認できました。

まとめ

ArticleモデルとTagモデルがManyToMany(多対多)とすることができました。その紐付けはarticle_tagテーブルという中間テーブルを利用しました。

とても簡単に実装することができましたね。それぞれのテーブルに関係性を持たせるだけで、SQLを書くことなく動かせるというのはとても応用の効く手段かなと思います。

次回は、画面側でManyToManyのモデルをどのように使うのかを紹介していきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax