web-dev-qa-db-ja.com

yii2Activerecordのリレーションテーブルでカウントを取得します

投稿用とユーザー用の2つのテーブルがあります。ユーザーリストのグリッドビューにユーザーの投稿数を表示したい。 In yii 1これをモデルで使用して、この目的の関係を定義します。

'postCount' => array(self::STAT, 'Post', 'author',
            'condition' => 'status = ' . Post::ACTIVE),

...
User:find...().with('postCount').....

しかし、これをYii2に実装して、ユーザー:find():with( '...')の投稿数を取得してグリッドビューに表示する方法がわかりません。
yii2でこれを試す人はいますか?

5
Araz Jafaripur

これが私がしたことの例であり、これまでのところうまく機能しているようです。投稿へのコメント数を取得するために使用されました。私は単に標準のアクティブレコードカウントを使用し、$ this-> idとカウントを取得するエントリの主キーを使用してwhereステートメントとの関係を作成しました。

public function getComment_count()
{
    return Comment::find()->where(['post' => $this->id])->count();
}

ただそれを渡すだけ...

8
brdflp

以下のコードを試すことができます。

User::find()->joinWith('posts',true,'RIGHT JOIN')->where(['user.id'=>'posts.id'])->count();

または、ユーザー数を指定する場合:

//user id 2 for example
User::find()->joinWith('posts',true,'RIGHT JOIN')->where(['user.id'=>'posts.id','user.id'=>2])->count();

postsは、以下のようにUserモデルで定義された関係であることに注意してください。

public function getPosts()
{
    return $this->hasMany(Post::className(), ['user_id' => 'id']);
}
3

それでも、関係する可能性のある人にとっては、データではなく選択したカウントだけが必要な場合は、代わりにこれを使用する方がよいと思います。

$count = (new \yii\db\Query())
->select('count(*)')
->from('table')
->where(['condition'=>'value'])
->scalar();

echo $count;
2