私は2つのテーブルを持っています:users
とposts
。少なくとも1つの投稿があるユーザーを選択しようとしています。
これには、結合または副選択のいずれかが必要だと思います。これを簡単にするCakePHPの何かがありますか?
これにより、1つ以上の投稿を行ったすべてのユーザーが選択されます
SELECT * FROM `users` as u
INNER JOIN `posts` as p ON p.user_id = u.id
ケーキでは、次のようなことができるはずです。
$this->User->find('all', array('joins' =>
array(
'table' => 'posts',
'alias' => 'p',
'type' => 'inner',
'conditions' => array(
'User.id = p.user_id'
)
)
);
[編集]
多分あなたは追加することができます
'group' => 'User.id'
また
'fields' => 'DISTINCT User.id, ...'
重複するエントリを削除するには
カウンターキャッシングを使用します。http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongstoを参照してください。
counterCache:trueに設定すると、save()またはdelete()を実行するたびに、関連するモデルが外部テーブルの「[singular_model_name]_count」フィールドを自動的に増減します。文字列の場合は、使用するフィールド名です。カウンターフィールドの値は、関連する行の数を表します。キーがフィールド名で値が条件である配列を使用して、複数のカウンターキャッシュを指定することもできます。例えば:
array('recipes_count' => true、'recipes_published' => array('Recipe.published' => 1))counterScope:カウンターキャッシュフィールドの更新に使用するオプションの条件配列。
この場合、追加のクエリは必要ありません。投稿を追加/削除すると、usersテーブルのカウントが自動的に減少します。
例:
public $belongsTo = array(
'User' => array(
'foreignKey' => 'user_id',
'counterCache' => true,
'counterScope' => array(
'published' => 1)));