CakePHP , Lazyloadについて

しばらく躓いてしまったのでメモ書き程度に残そうと思います. ある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プラグインを使えばこのような挙動はしないのかもしれません.機会があれば試してみようと思います.