Comment モデルが関連付けられた Post モデルがあります。各コメントには User モデルに関連付けられた user_id があります...すべて非常に標準的なものです。
基本的に、関心のあるすべての投稿に対して検索クエリを実行するとき、各投稿にコメントした一意の user_id の数を効率的に取得する方法を探しています。
Comment モデルが関連付けられた Post モデルがあります。各コメントには User モデルに関連付けられた user_id があります...すべて非常に標準的なものです。
基本的に、関心のあるすべての投稿に対して検索クエリを実行するとき、各投稿にコメントした一意の user_id の数を効率的に取得する方法を探しています。
使用したことがありますcounterCache
か?それはおそらくあなたがいる必要がある場所にあなたを連れて行くでしょう。また、それをのいくつかの派手な条件と組み合わせたいと思うでしょうcounterScope
。これにより、レコードを保存/更新するときに、その場でではなく、コメント投稿者の数を保存できます。その結果、ページが高速になり、ユーザーエクスペリエンスが向上します。
さて、これだけでは最終的な解決策にたどり着かないかもしれません。counterCache / counterScopeとvirtualFieldsの組み合わせを使用してデータをプルし、そのように更新することを検討してください。
Post hasMany Comment関係を想定しているので、検索結果は次のようになります。
$posts = array(
0 => array
(
'Post' => array
(
'id' => 1
, 'Comment' => array
(
0 => array
(
'id' => 1
)
, 1 => array
(
'id' => 2
)
)
)
)
, 1 => array
(
'Post' => array
(
'id' => 2
, 'Comment' => array
(
0 => array
(
'id' => 3
)
)
)
)
, 2 => array
(
'Post' => array
(
'id' => 3
, 'Comment' => array
(
0 => array
(
'id' => 4
)
, 1 => array
(
'id' => 5
)
, 2 => array
(
'id' => 6
)
)
)
));
次に、Setクラスを使用して、次のようなIDだけを抽出できます。
$userIds = Set::extract($posts, '{n}.Post.Comment.{n}.id');
また、重複がある場合は、array_uniqueを呼び出すことができます。
$userIds = array_unique($userIds);
それでいいはずです!