0

私は2つのテーブルを持っています:usersposts。少なくとも1つの投稿があるユーザーを選択しようとしています。

これには、結合または副選択のいずれかが必要だと思います。これを簡単にするCakePHPの何かがありますか?

4

2 に答える 2

1

これにより、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, ...'

重複するエントリを削除するには

于 2012-09-28T00:02:34.447 に答える
1

カウンターキャッシングを使用します。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)));
于 2012-09-28T00:08:00.367 に答える