CakePHP フレームワーク内で、私が長い間問題を抱えていたことの 1 つは、2 つのモデル間の同時hasOne
およびhasMany
関係を定義することです。例えば:
BlogEntry hasMany Comment
BlogEntry hasOne MostRecentComment
(最新のフィールドのMostRecentComment
はどこですか)Comment
created
BlogEntry モデル プロパティでこれらの関係を定義するのは問題があります。CakePHP の ORM は has-one 関係を として実装しているINNER JOIN
ため、複数の Comment があるとすぐに、BlogEntry::find('all')
呼び出しは BlogEntry ごとに複数の結果を返します。
過去にいくつかの方法でこれらの状況を回避してきました。
モデル コールバックを使用して (場合によっては、コントローラーやビューでも!)、MostRecentComment を次のようにシミュレートしまし
$this->data['MostRecentComment'] = $this->data['Comment'][0];
たComment.created
。また、MostRecentComment フィールドでソートする Cake の組み込みのページネーション機能もありません (たとえば、BlogEntry の結果をMostRecentComment.created
.追加の外部キーの維持、
BlogEntry.most_recent_comment_id
. これは維持するのが面倒で、Cake の ORM を壊しBlogEntry belongsTo MostRecentComment
ます。それは機能しますが、見た目が...間違っています。
これらの解決策には多くの要望が残されていたので、先日この問題に腰を下ろし、より良い解決策に取り組みました。私は最終的な解決策を以下に投稿しましたが、これまでずっと私を逃れてきた驚くほど単純な解決策があることを発見すると、わくわくします (そしておそらく少し悔やまれます)。または、私の基準を満たす他のソリューション:
- レベルで MostRecentComment フィールドで並べ替えることができる必要があり
Model::find
ます (つまり、結果のメッセージだけではありません)。 comments
またはblog_entries
テーブルにフィールドを追加する必要はありません。- CakePHP ORM の「精神」を尊重する必要があります。
(この質問のタイトルが可能な限り簡潔/有益であるかどうかもわかりません。)