ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

CakePHPで深いAssociateを持った階層の値をDBから取得する

こんばんは!エンジニアインターンの竹本です! 今回はControllerと直接繋がっているテーブルの「ひ孫要素テーブル」という深い階層のデータをとってくる時に気にしなければいけないことについて書いていきたいと思います。

そもそもCakePHPでDBから値を持ってくるときの手順って?

以前僕がmvcフレームワークはModel→Controller→Viewの手順で画面に表示させることを説明しましたが、そもそもCakePHPのModel = データベースから値を持ってくるときの手順を知りたいですよね。今回は元々データの入ってるtableを使っていきましょう。

実際の手順

  • Table①でなんの値をとってくるかなどのメソッドを定義

  • ControllerでTable①のメソッドを呼び出す変数を定義

  • Viewで変数を呼び出し、値を表示させる

これがシンプルなデータの取り方です。ですが、今回話すのはTable①にひも付いてひも付いたTable④の値をとってくる時のポイントです。進めていきましょう。

テーブル①とテーブル②の繋げ方

ControllerでTable①と紐づけている状態で子Table②のデータをとってきたいとき、Table同士でassociateしなければいけません。

associateとはもである同士の関係を示すものでこれがないとTable②やTable③のなどのControllerとつながっていないDBからデータをとって来ることができません。

この作業をTable②とTable③&Table③とTable④で各々の関係をしめさないといけません。

associateについては以下のURLから確認ください。

アソシエーション - モデル同士を繋ぐ

Modelの中のメソッドで親子関係を定義

テーブル同士でassociateしてTable①のメソッド内でもどの手順でTable④までの到達過程を記述しなければいけません。

Table①内で

public function findXxxxxxx{
       return $query->contain([
            'table②' => [
                'Table③'=>[
                    'Table④'
                ],
    ]
    ]);
}

このようにメソッド内でTableの関係を示さなければなりません。

このメソッドをControllerでloadModelでデータベースと紐づけて、変数定義で呼び出してあげると値がとってくることができます。

あとはそれをViewで表示することで大丈夫だと思います。