Yii2, найти пользователей с активной публикацией

У меня есть таблица user и post с отношением 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(), потому что я хочу использовать его в модели поиска

Спасибо.


person ingenious    schedule 16.06.2016    source источник


Ответы (3)


Вам нужно добавить условие, используя 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();
person HeadwindFly    schedule 16.06.2016
comment
Вместо метода from(['t1'=>User::getTableSchema()->name]) ==›› User::find()->alias('t') можно использовать метод ActiveQuery::alias. - person ingenious; 19.06.2016
comment
@ingenious Спасибо за дополнение :). - person HeadwindFly; 19.06.2016

Лучший способ:

User::find()->joinWith(['posts' => function(ActiveQuery $q){
    $q->where(['status' => 1]);
}])->all();
person Vitaly    schedule 16.06.2016

Однако вы можете использовать литерал, используя User::find()

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