1

我有userpost表的oneToMany关系:

在后期模型中:

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

您需要使用 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 回答
1

最好的办法:

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

您可以使用文字 where 但是使用 User::find()

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