Help us understand the problem. What is going on with this article?

【Laravel】中間テーブルに値を追加・更新する方法

実現したいこと

中間テーブルに値を追加・更新する。

タグ機能を作る際に、プロジェクトテーブルとタグーテーブル紐付ける際に
中間テーブルを作り、値を追加・更新することができたので、紹介します。

テーブル設計

タグテーブル

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. テーブルのリレーションの設定
  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メソッドは追加、更新ができる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away