#実現したいこと#
中間テーブルに値を追加・更新する。
タグ機能を作る際に、プロジェクトテーブルとタグーテーブル紐付ける際に
中間テーブルを作り、値を追加・更新することができたので、紹介します。
##テーブル設計##
####タグテーブル
id | name |
---|---|
1 | Javascript |
2 | PHP |
####プロジェクトテーブル
id | title |
---|---|
1 | フロントエンドを学習しよう |
2 | バックエンドを学習しよう |
####中間テーブル(プロジェクトタグテーブル)
id | tag_id | project_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
中間テーブルはこのように、テーブ同士が多対多の関係の時に必要になります。
##中間テーブルに値を追加する方法
###中間テーブルに値を入れるためのステップ
- テーブルのリレーションの設定
- 中間テーブルにアクセスし、値の追加
##1. テーブルのリレーションの設定
タグのモデルでプロジェクトと紐付けます。belongsToManyは多対多のリレーション
時に使います。これで中間テーブルにアクセスするための準備は完了です。
public function project()
{
return $this->belongsToMany(Project::class);
}
##2. 中間テーブルにアクセスし、値の追加
実際に値を追加します。値を追加する場合はattach()を使います。
まず、どのプロジェクトにタグを紐ずけるか、設定します。
今回は、projectのid:1にタグid:1を設定し、attachメソッドで追加します。
$project = Project::find(1);
//idが1番のプロジェクトを取得します。
$project->tags()->attach(1);
//プロジェクトid:1にタグid:1を追加します。
中間テーブルを確認すると下記のようになります。
id | tag_id | project_id |
---|---|---|
1 | 1 | 1 |
このように、中間テーブルに値を追加できます。
##中間テーブルの値を更新する場合
更新したい場合は、syncメソッドを使います。
syncメソッドの仕組みは値の削除、追加を行います。
今回の例なら、project_id:1にtag_id:1が登録されています。
syncを実行することで、tag_id:1を削除します。そして、$project->tags()->sync(2);
としているので、project_id:1のtag_id:に2を追加します。
なので、attachを使わなくても、追加、更新はsyncでできてしまうのです。
$project = Project::find(1);
//idが1番のプロジェクトを取得します。
$project->tags()->sync(2);
//中間テーブルのproject_id:1のtag_idを更新
中間テーブルを確認すると下記のようになります。
id | tag_id | project_id |
---|---|---|
1 | 2 | 1 |
##まとめ
中間テーブルへの値の追加はattach()メソッド、値の更新はsync()メソッド。
attach()を使わなくても、syncメソッドは追加、更新ができる。