プログラム開発の情報や、雑記を投稿しているサイトです。

異なるモデル同士を繋ぐアソシエーションの使い方

how-to-cakephp-associations

本記事では、複数テーブルを結合したアソシエーションの使い方を説明いたします。
複数テーブルを利用するプログラムは、複雑な印象を持たれると思いますが、基本的な機能をbakeコマンドで自動生成することができます。

アソシエーションの使い方を説明するにあたり、事前準備が必要になります。
事前準備ができない場合には、各テーブルのデータ構造をイメージしながら読み進めていただければと思います。

今回のサンプルプログラムは、ユーザー毎に複数のメモを登録できるアプリケーションで説明いたします。

アソシエーションとは

アプリケーションでは、異なるオブジェクト同士を関連付けたいことはよくあります。
例えば、ユーザー毎に複数のメモを登録できるようなモデルの関係性などです。ユーザーは多くのメモを持っています。
CakePHP はこうしたアソシエーションが簡単に管理できます。

CakePHP には、以下の4つのアソシエーションがあります。

  • hasOne
  • hasMany
  • belongsTo
  • belongsToMany

事前準備

準備としては、テーブルの作成と、サンプルデータの登録を行います。

サンプルテーブルの作成

作成するテーブルは、ユーザー情報を管理するテーブルと、メモ帳を管理するテーブルを作成します。
ユーザー情報とメモ帳のアソシエーションは、1対多となります。

サンプルデータの登録

下記のクエリーを実行し、各テーブルへデータ登録を行います。

サンプルデータの確認

正常にサンプルデータが登録されているかを、テーブルを検索して確認します。

プログラムファイルの生成

cakePHPでは、bakeによるソースコードのジェネレート機能があります。
今回は、この bake を使って、データベースに登録されているテーブルを基に、各プログラムファイルを生成していきます。

作成できるモデル一覧

下記のコマンドを実行し、作成できるモデル一覧を確認します。

モデルの作成

コントローラーの作成

テンプレートの作成

テーブルの結合条件の確認

Users と Notes テーブルのアソシエーションの設定は、各コントローラーの paginate にて、テーブルの設定を行います。

動作確認

下記のURLにアクセスすると、生成した画面が表示されます。
http://ドメイン名/app/users

how-to-cakephp-associations-1

 

 

 

how-to-cakephp-associations-2

 

 

 

 

how-to-cakephp-associations-3

 

 

 

 

http://ドメイン名/app/notes

how-to-cakephp-associations-4

 

 

 

how-to-cakephp-associations-5

 

 

 

how-to-cakephp-associations-6

 

 

 

まとめ

ここまで説明したとおり、複数テーブルを結合したアソシエーションの実装は、非常に簡単になっています。
それぞれ、適切なコマンドを実行することで、大幅に工数を削減することができると思います。

ただ、自動生成したソースを、しっかりとメンテナンスできるように把握しておく必要があります。
自動生成だけに頼った場合に、深い部分の実装に手を入れることが難しくなってしまいます。

そのため、しっかりと、コマンドと、実行後に生成されるファイルの関連性を理解しておく必要があります。

手間がかかる部分もありますが、上記の一連の作業の通り、圧倒的に作業工数が削減できます。
複数テーブルを結合する検索処理でも、SQLクエリーでJOINするよりも、非常に簡単となります。