Laravel

LaravelのManyToManyのリレーションについてのまとめ

この記事では、LaravelのモデルのManyToManyのリレーションについて紹介します。

ManyToManyリレーションとは

MayToManyリレーションとは、2つのモデル間で多対多の関連性を表現するために使用されます。

例えば、articlesとtagsというモデルがある場合、articlesはそれぞれは複数のtagsに紐づいていて、tagsのそれぞれも複数のarticlestに紐づいている時にarticlesとtagsはManyToManyリレーションになります。

中間テーブル

ManyToManyリレーションでは中間テーブルが存在します。このテーブルは2つのモデル間のリレーションシップを記録するために使用されます。

例えば、aritclesとtagsのテーブルの中間テーブルarticle_tagは次のように表現されます。

article_id int
tag_id int

aricle_idとtag_idはそれぞれarticlesとtagsの主キーの外部キーです

このように中間テーブルでは関連する2つのテーブルの主キーの組み合わせを保存することでリレーションを管理します。

LaravelでのManyToManyリレーションの実装

実際にLaravelでManyToManyリレーションのモデルの実装例を紹介します。

マイグレーションを作成

今回はarticlesとtasと中間テーブルとしてarticle_tagを作成します。それぞれのマイグレーションファイルは以下になります。

articlesテーブル

tagsテーブル

article_tagテーブル

article_tagテーブルはaritle_id、tag_idのカラムを持ちます。それぞれarticlesのid(主キー)、tagsのid(主キー)への外部キーです。

マイグレーションファイルを作成したら、php artisan migrateでマイグレーションを実行します。

モデルを作成

次にモデルを作成します。

app/Models/Article.php

app/Models/Tag.php

モデルのデータを作成

次にArticle、Tagモデルのデータをphp artisan tinkerで以下のように作成します。

Articleのデータを1つ、Tagのデータを2つ作成しました。

ManyToManyリレーションを構築する

最後にManyToManyリレーションを構築します。

articleにtag1とtag2を紐付けたい場合は次のようにattachメソッドを使用します。

その後articleに紐づいているTagモデルのデータを取り出したい時には$article->tagsとすれば取得できます。

紐付けを解除したい場合はdetachメソッドを使用します。

最後にManyToManyのリレーションを特定のリストに更新したい場合のケースとしてsyncメソッドを紹介します。

例えば、新たにtag3を作成して、articleに紐づくtagはtag1とtag3にしたい場合は次のように表現します。

この場合、tag2の連結は解除されて、新たにtag1とtag3の関連付けがされます。

 

まとめ

この記事ではManyToManyリレーションの説明とLaravelでの実装の仕方についてまとめました。

Laravelではattach,detach,syncメソッドでManyToManyのリレーションを簡単に関連づけることができます。

本記事が参考になれば幸いです。

-Laravel

© 2024 Shiro's secret base