2016-06-16 11 views
1

私はuseroneToMany関係にpostテーブルがあります。ポストモデルでYii2は、アクティブなポストを持っているユーザーを検索

public function getUser() { 
    return $this->hasOne(User::className(), ['id' => 'user_id']); 
} 

とユーザーモデルで:私はしたい

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

少なくともアクティブな投稿を持つすべてのユーザーを検索します。 しかし私は何も考えていません。

マイターゲットSQL:

SELECT * FROM `user` 
where id in (select user_id from post where status = 1) 

私は何をしますか?

User::find()->where(... 

予告:その重要な発見で作成した()、私は、検索モデルに

おかげでそれを使いたいので。

答えて

1

あなたが使用して条件を追加する必要があります。

は、その(そのクエリ速度が他よりも速い)お勧めです。ActiveQuery ::別名方法を代わりに使用することができる

$condition = <<<EOL 
EXISTS (
     SELECT 1 from post t2 
     WHERE (t1.id = t2.user_id) 
       AND (t2.status = 1) 
) 
EOL; 

User::find()->from(['t1'=>User::getTableSchema()->name]) 
    ->where(new yii\db\Expression($condition)) 
    ->all(); 
+0

'([「T1」=>ユーザー:: getTableSchemaから( ) - > name]) '== >>' User :: find() - >エイリアス( 't') ' – ingenious

+0

あなたの補完ありがとうございました。 – HeadwindFly

0

しかしユーザー::見つける()

User::find()->where('id in (select user_id from post where status = 1)'); 
1

を使用して最良の方法はどこでリテラルを使用することができます:

User::find()->joinWith(['posts' => function(ActiveQuery $q){ 
    $q->where(['status' => 1]); 
}])->all(); 
関連する問題