Laravel

【Laravel】多対多テーブルを複数つくる方法【ちょっとコツがいります】

とある不動産検索システムの案件で、

物件ごとに、

設備の情報(例えばシステムキッチンとか角部屋とか)を持たせておいて、

一覧画面では設備の情報を3つ〜5つ見せつつ、

詳細の画面では設備の情報を全部表示させたい。

という要望がありまして。

アオキ
多対多テーブルを使えばいいと思うんだけど、多対多テーブルを一つ作るだけでいいんかな・・

ふと疑問に思ったのでメンターに相談してみました。

いくつかのやりとり後、メンターから返信あり、

メンター
不動産に紐付けるタグとは別に、一覧で表示用のタグを紐付けるのはOKです?
アオキ
tagテーブルとは別で、まったく同じ内容の 表示用のテーブルを作る、ということでしょうか、
メンター
tagテーブルはマスターデータなので、中間テーブルを紐付け用と表示用で作ってあげるイメージです。
アオキ
中間テーブルを別でつくるんですね! なるほど・・

ということで、中間テーブルを2つ以上つくる方法をまとめてみます。

laravel 5.5 で実施しています。

Sponsored link

laravel 多対多テーブルを2つつくる方法 まずはモデル

今回の構成です。

Propertiesテーブルが物件ごとの情報で、

Optionsテーブルに、設備の情報をずらっと並べています。

中間テーブルとして、

  • option_property テーブル と
  • optiondisplay_property テーブル

をそれぞれつくります。

まずはモデルから。

多対多なのでbelongsToManyなのですが、

  • 第一引数に相手側のモデル名
  • 第二引数に中間テーブル名
  • 第三引数に接続元モデルID (中間テーブルで使われる名称)
  • 第四引数に接続先モデルID (中間テーブルで使われる名称)

という順番で明記します。

アオキ
この書き順がキモですな。

こっちはあっさり。

laravel 多対多テーブルを2つつくる方法 マイグレーション

続いてマイグレーション(データベースのテーブル情報)。

多対多の場合、モデル同士は特に追記することはないです。

アオキ
一方、中間テーブルにはいろいろ書く必要あります。

リレーションでつなぐためにはデータの形を合わせる必要があり、
integerだとマイナスも含んでしまうため、
マイナスを含まないデータ型の unsignedInteger で指定する必要があります。

また、接続元のデータが削除された時に、合わせて中間テーブルの情報も削除したいので、
onDelete(‘cascade’) とつけることで、削除したときに同期して削除するようにしています。

もう一方の optiondisplay_property_table も同様に。

これで php artisan migrate とやるともりっとテーブルが作成されます。

アオキ
この辺の書き方、laravel当初は何が何だかでした、成長したよなぁ。
Sponsored link

laravel 多対多テーブルを2つつくる方法 ビュー側

今回はチェックボックス想定で、
@foreach で回しつつ、nameの箇所は配列にする必要があります。

laravel 多対多テーブルを2つつくる方法 コントローラー側

コントローラーがちょっと悩ましく、
果たしてこれがベストなのかというと怪しいなぁと思いつつ、

動くことは動いたのであえて公開します。

新規登録のタイミングだと、登録したタイミングでないとProperty側のid番号がわからないので、

  • 一旦Propertyモデルをセーブ
  • 保存したidを取得
  • リクエスト情報を取得
  • 保存したidのPropertyインスタンスを生成
  • syncで中間テーブルに同期保存

としています。

アオキ
本当は同時に保存できる方法がありそうなんですが、なかなかしっくりくる方法が見つからず・・
Sponsored link

laravel 多対多テーブルを2つつくる方法を実際に試してみて

保存のメソッドがこれでいいのか、という疑問はのこりつつも、

多対多テーブルを2つ以上自由につくれるようになったというのはとても大きくて、

いろんなバリエーションのデータベース構成がつくれるようになるなと実感しました。

アオキ
こりゃあますます案件いっぱいこなしていかないとですな。
created by Rinker
¥2,959 (2019/03/18 23:23:30時点 Amazon調べ-詳細)

『Laravel』ではこんな記事も読まれています。

1. 【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初心者向け】

2. 【PHP】【laravel】CSVエクスポートの方法〜5つのポイント〜

3. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

4. 【laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】

5. 【Laravel5.5】Webアプリケーションを作るためのゆるめの環境構築編【Node.js】【npm】【Vue.js】【初心者向け】

6. LaravelとVue.jsのサンプル動画を見ながらさらりと解説してみる

7. 【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】

8. 【Laravel】フォトギャラリーを作るための画像アップロード方法【php】

9. 【Laravel】多対多テーブルを複数つくる方法【ちょっとコツがいります】

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


Sponsored link

関連記事

  1. Laravel

    【Laravel5.5】Webアプリケーションを作るためのゆるめの環境構築編【Node.js】【np…

    ロリポップやXサーバーなど、格安のレンタルサーバーでも運用できるプ…

  2. Laravel

    【Laravel】フォトギャラリーを作るための画像アップロード方法【php】

    とある不動産検索システムの案件で、1物件あたり画像を10枚くらいア…

  3. Laravel

    【laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfak…

    『PHPの現場』というポッドキャストの放送で、ひときわ印象に残…

  4. Laravel

    【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初…

    ウェブ職人のためのPHPフレームワークといえばやっぱり『Larav…

  5. Laravel

    【PHP】【laravel】CSVエクスポートの方法〜5つのポイント〜

    ちょっと前にPHPでCSVインポートをする方法を書きまして。今回…

  6. #100DaysOfCode

    【Vue.js/Laravel】Webアプリ実践記 37歳おっさんが独学でVue.js+Larave…

    webアプリ実践記 0日目~10日目webアプリ実践記 11…

Sponsored link

最近の記事

アーカイブ

Sponsored link
  1. docker初心者向けdocker-composeからやったほうがいいかもよ

    Docker

    【Docker】初心者はdocker-composeから始めた方がいいかもしれな…
  2. Laravel

    【PHP】【図解】クラスと抽象クラスとインターフェースとトレイトとDIをまとめて…
  3. Vue.js

    Vue.js+Vue-router+BulmaでさくっとSPAをつくってみた【初…
  4. PHP

    【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】
  5. Laravel

    【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【…
PAGE TOP