CakePHP3でbindingKeyを使ってモデルを紐づける方法

CakePHP3でbindingKeyを使ってモデルを紐づける方法

69 回閲覧されました

みなさんこんにちは、jonioです。

「モデルA→モデルB→モデルC→モデルD」の関係があったとします。

モデルAから始まってモデルDの呼び出しをする場合に直接的に呼び出しができればいいですが今回のように複数のモデルを経由する場合はDBへ何度もアクセスするのでDBの負荷がかかります。

アプリ利用者が多くなればなるほどDBの圧迫が大きくなってサーバーダウンしかねません。

そこでDBへ何度もアクセスするのを防ぐ方法を解説します。

おすすめ参考書

CakePHP3はまだまだ仕事で使われます。

下記の参考書がおすすめです。

同じカラムを用意する

モデルAとモデルDに同じカラム(demoカラムとします)を用意して何らかの方法を使って同じ値が入った状態にします。

〜Table.phpに記述してアソシエーションの関係を作る

モデルAに下記の記述をします。

$this->belongsTo('ModleD', [
    'foreignKey' => 'demo',
    'bindingKey' => 'demo'
]);

そしてモデルDに下記の記述をします。

$this->hasMany('ModelA', [
    'foreignKey' => 'demo',
    'bindingKey' => 'demo'
]);

「bindingKey」を使うことで共通のカラムを通じてアソシエーションを行います。

コントローラーに記述

書いているコードは適当ですがアソシエーションの〜Table.phpの記述がちゃんとできていたらModelAからModelDのデータの取得ができます。

$demoData = 'デモですよ';

$this->ModelA->find()->contain([
    'ModelD' => function ($q) use ($demoData) {
        return $q->where(['ModelD.demo' => $demoData]);
    }
])->where(['ModelA' => $demoData])->first();