attach, sync, syncWithoutDetachingの比較と使い方。意外と便利なsyncWithoutDetaching

Laravelデータベース
スポンサーリンク

Laravelは多対多リレーションを使って、データを色々な形で保存できます。

意外と便利なのが、syncWithoutDetaching

完全重複以外は、重複OKにできちゃいます。

syncWithoutDetachingを直訳すると「デタッチ(紐づけ解除)せずに、シンク(同期)をする」という意味。

他の方法との比較と、使い方を解説していきますね。

スポンサーリンク

attach, sync, syncWithoutDetachingの比較と使い方

【リレーションでデータ保存する方法比較】

attach 中間テーブルにデータを挿入できる

重複はいくらでもOK

sync 中間テーブルに【値を重複させず】データを挿入できる

重複した場合は削除

syncWithoutDetaching 中間テーブルに【値を重複させず】データを挿入できる

完全重複以外は、重複OK

なお、どの方法を使うにしても最初にふたつのモデル同士でリレーションを作っておきましょう。

今回はQuizモデルとUserモデルでリレーションを作ります。

前準備

まずは前準備をしておきます。

すでにリレーションができている方は、この項目はスキップしてください。

①リレーション作り

Quizモデルファイルに、次のように入れておきます。

Userモデルファイルには、次のように入れます。

リレーションの作り方は、下記の記事でモデルの作り方から解説しています。

②ルート設定

ルート設定を作成します。

メソッドは 【put】としておきます。

アドレスなどはお好きなように設定してください。

③ビューファイル(blade.php)作成

ビュー部分を作っておきます。

今回は、ボタンを押すと、コントローラーで処理が行われるようにします。

blade.phpファイルに次のようなボタンを追加しておきましょう。

attachを使った場合

それでは、コントローラー側の処理を記述していきましょう。

まずはattachから。

フォームからデータを受け取った後、コントローラーのコードは、こんなふうになります。

attachを使うと、完全重複を含め、すべてのデータが中間テーブルに保存されます。

買い物かごに商品を追加する時などには、使えます。

ただ、完全に同じデータは保存不要、という場合には向きません。

syncを使った場合

次はsync。syncは重複なしで登録したい場合に使います。

コントローラーの記述はこんなふうにします。

この状態でデータを保存していくとしましょう。

例えば、次のようなデータがあるとします。

ここで、quiz_id=4, user_id=2のデータを保存してみます。

すると次のように、quiz_id=4, user_id=4 のデータが削除されてしまいました。

syncはこのように重複を消してくれます。

ただ、自動的に【削除=紐づけ解除】してしまうので、注意してください。

勝手に削除したくない場合は、次のように引数にfalseを入れます。

ただ、なんだか怖いですし処理がメンドウ。

そこで、便利なのが次のsyncWithoutDetachingです。

syncWithoutDetachingを使った場合

syncWithoutDetachingはその名のとおり、デタッチ(紐づけ解除)なしでsyncができるメソッド。

コード例はこちら。

次のように、完全重複以外は、重複OK。

ケースバイケースですが、syncWithoutDetachingは活躍の場が多いような気がします。

ただ名前が長すぎるせいか^^; あまり知られていない気も。

機会があったら、お試しください。

Laravelデータベース

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中!
会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

【個別サポート実施中】

「本ブログに記載の方法を試してみたけれど、うまくいかない」「コードを見てほしい」という方のために、有償でメールサポートいたします。以下のボタンをクリックして相談フォームにアクセスして下さい。

詳しく見る

Twitter始めました。
スポンサーリンク
40代からプログラミング!

コメント

タイトルとURLをコピーしました