2016-06-16 9 views
1

Ich habe user und post Tabelle mit oneToMany Beziehung:Yii2, findet Benutzer, die aktiven Beitrag hat

In Pfosten Modell:

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

Und in User-Modell:

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

Ich mag Finde alle Benutzer, die mindestens einen aktiven Beitrag haben. Aber ich habe keine Ahnung.

Mein Ziel SQL:

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

Was kann ich tun?

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

Hinweis: es ist wichtig, dass mit find() erstellt wurde, weil ich es auf der Suche Modell

Dank verwenden möchten.

Antwort

1

Sie benötigen einen Zustand hinzufügen, wo verwenden.

Es wird empfohlen, dass (es Abfragegeschwindigkeit als andere schneller ist):

$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

Die ActiveQuery :: alias Methode statt verwendet werden kann, die 'aus ([ 't1' => User :: getTableSchema () -> name]) '== >>' Benutzer :: find() -> alias ('t') ' – ingenious

+0

@ingenious Vielen Dank für Ihre Ergänzung :). – HeadwindFly

0

können Sie wörtliche verwenden, wo jedoch Benutzer mit :: finden()

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

Der beste Weg:

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