しばらく躓いてしまったのでメモ書き程度に残そうと思います. あるArticleというレコードがhas OneアソシエーションでArticle Metaというメタ情報を保存するテーブルと関連付けられていたとします.
このとき,メタ情報にはcontainでeager loadしなくても,_getメソッドをテーブルに記述しておくことで,あとからlazy loadできるよにしておきます.
protected function _getArticleMeta() { $metas = TableRegistry::get('ArticleMetas'); return $metas->find('all') ->where(['article_id' => $this->id]) ->first(); }
これでcontainでeager loadしなくても$article->article_meta
でメタ情報にアクセスできるようになります.
しかし,これだと新しくEntityを追加する際にメタ情報が弾かれてしまします.(詳しい原因はよくわかりません)
以下では Article Tableでarticle_metaのaccessibleフィールドは適切に設定されているものとします.
$data = [ 'titile' => "about CakePHP", 'contents' => "aaaa" 'author' => "Bob" 'article_meta' => [ 'url' => 'http://exmaple.com/123/45/67', ] ]; $article = $this->Articles->newEntity($data); \Cake\Log\Log::error($article);
この操作の出力結果は手元では以下のようになりました.
'article' = [ 'titile' => "about CakePHP", 'contents' => "aaaa" 'author' => "Bob" 'article_meta' => null ];
メタ情報にきちんと値がセットされませんが,上述のLazy loadに関する記述を削除したところ挙動が改善しました. Lazy Loadプラグインを使えばこのような挙動はしないのかもしれません.機会があれば試してみようと思います.