0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

cakePHP でうまくアソシエーションが読み込めない

Last updated at Posted at 2023-11-08

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?