1

私は関係のあるテーブルを持っuserています:postoneToMany

投稿モデル:

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(...

注意:検索モデルで使用したいので、find()で作成することが重要です

ありがとう。

4

3 に答える 3

1

最良の方法:

User::find()->joinWith(['posts' => function(ActiveQuery $q){
    $q->where(['status' => 1]);
}])->all();
于 2016-06-16T17:53:47.487 に答える
1

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

推奨事項 (クエリ速度が他よりも速い場合):

$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();
于 2016-06-16T23:13:05.730 に答える
0

ただし、 User::find() を使用してリテラルを使用できます

 User::find()->where('id in (select user_id from post where status = 1)');
于 2016-06-16T17:38:42.143 に答える