2016-06-16 5 views
1

У меня есть user и post стола с oneToMany соотношения: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

Вам нужно добавить условие, используя где.

Это рекомендуется (это скорость запросов быстрее, чем другие):

$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

В ActiveQuery :: метод можно использовать псевдоним вместо 'из ([ 't1' => User :: getTableSchema () -> name]) '== >>' User :: find() -> alias ('t') ' – ingenious

+0

@ingenious Спасибо за дополнение :). – HeadwindFly

0

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

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(); 
Смежные вопросы