cakePHP3 ではまったので共有。
今回はまったポイント
アソシエーションを別名で定義していた場合、孫要素のcontainがうまくいかなかった。
例)
()内はテーブル名です
①「記事(documents)」には「評価(evaluations)」が紐づいている。
②「評価(evaluations)」には「高評価(good_evaluations)」と「低評価(bad_evaluations)」がある。
③「評価(evaluations)」には「ユーザー(users)」が紐づいている。
・・・・・
上記の条件で低評価を下したユーザー名を取得したい場合、
いつものように書くと孫要素である「ユーザー(users)」が読み込めない。
documentsTable.php
$this->hasMany('bad_evaluations', [
'className' => 'evaluations',
'conditions' => ['value' => -1],
...
'propertyName' => 'bad_evaluations'
]);
evaluationsTable.php
$this->belongsTo('users', [
...
]);
documentsController.php
$this->documents->find()->contain(['bad_evaluations' => ['users']);
// ↑ ここでエラーが起こる
原因は、classNameの定義が小文字だったから。
classNameを大文字で指定したらアソシエーションが読み込まれた。
// documentsTable.php
$this->hasMany('bad_evaluations', [
- 'className' => 'evaluations',
+ 'className' => 'Evaluations',
'conditions' => ['value' => -1],
...
'propertyName' => 'bad_evaluations'
]);
教訓
小文字でも子要素である「評価(evaluations)」レコードの取得は可能。
cakePHPは自動補完してくれるため開発効率がいいが、
定めている通りに書かないと、どこかでボロが出るとわかった。
https://book.cakephp.org/3/ja/orm/associations.html