「1対多」と中間テーブルを使った「多対多」連携についてCakePHP3で「1対多」のテーブル連携を、中間テーブルを利用した「多対多」のテーブル連携方式に変えるときの手順を紹介します。どのような場合に必要になるか、というと例えば、Topics、Categoriesというテーブルがあるとします。Categoryによって分類されています。Categoryが割り当てられていました。Categoryにまたがるものもあることが判明しました。そのため、それまでは「1対多」だったテーブル構成を、中間テーブル作成して「多対多」に対応できるようにすることにしました。その時の対応方法の手順の紹介です。サンプルの「categories」と「topics」のテーブルは以下の想定です。CHARSET=utf8;カテゴリは、下記の記事でも紹介していますが、CakePHP3のブログチュートリアルにあるツリービヘイビアの機能を利用したカテゴリの構造になっています。先に、「例えば」と書いてしまいましたが、まさに、今回私が必要になった状況です。Categoryに属する場合があり、対応を迫られたのです。CakePHP3で中間テーブルを利用した処理は下記の検索処理などで使っていました。CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装そのため、構築の仕方は理解していましたが、今回の対応を行うときに対応漏れがあり、うまく動かずに悩んだことがありました。そのため、今後のためにも手順を記録しておくことにしました。中間テーブルを作成するまず最初に中間テーブルを作成します。中間テーブルは、「topic_id」と「category_id」を持つテーブルです。CHARSET=utf8;「category_id」カラムを削除Topicsテーブルから不要になる「category_id」カラムを削除します。(削除しなくても問題は発生しませんが、不要なカラムは削除する方が望ましいでしょう。続いて、Tableファイルの更新になりますが、「TopicTable.php」と「CategoriesTable.php」とそれぞれ変更する箇所があります。初めに「TopicTable.php」は、下記の通り、「Categories」テーブルとの「belongsTo」を止めて「belongsToMany」に変更します。「CategoriesTable.php」は、下記の通り、「Topics」テーブルとの「belongsToMany」を追加します。今回は設定がありませんでしたが「hasMany」の設定をしている場合は、その処理は削除します。'topics_categories']);inputTopics.phpの更新カテゴリの選択する箇所のテンプレートを更新します。ここでは、マルチセレクト(複数選択式)のセレクトボックスを設定しています。["type"=>"select","multiple"=>"select",'options'=>$categories]);Entity/Topic.phpの更新ここ以降の項目が対応忘れが発生しやすい箇所になります。1つ目が「Entity」です。下記のように「category」は「categories」のように複数形になります。コメントにも書いていますが、これを記述していないと値が保存されません。エラーは出ませんので原因を特定しにくいエラーです。true,」で設定している場合は特に対応は必要ありません。trueTopicsController.phpの変更コントローラーの変更ポイントです。find()で値を取得する際に、関連テーブルとして「Categories」を指定する必要があります。コメントに書いていますが、これがないと、テーブルには保存されたレコードがあるのにも関わらず、その情報が更新画面に出てこない、というエラーになります。これもエラーが出ないため、原因を特定しにくいエラーです。get()で取得する場合は問題ありませんが、「category_id」を検索条件に検索する場合は記述する内容が大きく変わります。$q->where(["category_id"=>$categoryId]);});細かなところですが、条件の「"category_id"=>$categoryId]」の「$categoryId」を変数とするなら「use($categoryId)」の記述が必要です。use句は記述する必要はありません。最後に、データの取り出しの際も変更の注意点があります。「category」は複数入ることがあるためここも複数形の「categories」にする必要があります。中間テーブルはちょっとだけ仕組みの理解が必要なため、中間テーブルについてもう少し理解を深めたい、という場合もあるでしょう。いう場合は下記の記事なども参考になるかと思います。Ajaxを使う方法の解説。Successとthenの両方を解説。CakePHP3GoogleAdwordsGoogleAdwords最後までお読みいただきましてありがとうございます。コメントをキャンセルメールアドレスが公開されることはありません。*サイト下記の空欄を埋めてください。date*日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)※入力いただいたコメントは管理者の承認後に掲載されます。View、ctpファイルでコメントを記述する方法を解説。CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。bakeの超初心者向けフォロー講座CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定するCakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。エレメントとして分割することでメンテナンス性も向上させる。Queryを利用して実装する方法をサンプルソース付きで解説します。小学校でプログラミングの授業が始まる。プログラムを組むことを覚えることが本質ではなく理論的な手順の組み立てのトレーニングをする授業という理解が必要だと思う。Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。具体的なスクレイピングを実行するサンプルソースも。Parser」の使い方を解説。要素を取得する方法、そこから属性を取得する方法を解説。マニュアルにはない注意点なども解説。2020.01.27PHPでスクレイピング。スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。Parser」をオススメする。2020.01.26PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。add_shortcode関数を使ったショートコードという機能を利用します。不正なコピーコンテンツからの直リンクを拒否する.htaccessの設定方法。拒否するサイトを指定、許可するサイトを指定する方法、単純な拒否と画像の差し替えを解説。口コミサイトを作るために必要な評価点、レビューを投稿できるプラグインを探して評価。10プラグインをチェックし、8プラグインは詳細解説付き。2014.07.17BackWPupでバックアップ・リストア(復元)の具体的手順BackWPupその9。バックアップファイルからのリストア(復元)の手順です。109キーボード)は日本人サイズのキーボード。ショートカットも押しやすく女性や子供にも優しいサイズ。Web開発・運用に役立つ記事を中心に紹介しています。