Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Yii2 - linker Join bei mehrfacher Bedingung

Ich glaube, dass dies eine bessere Lösung ist. Anstatt Raw-Abfragen wie leftJoin zu verwenden Sie sollten Ihr joinWith ergänzen Beziehungen mit andOnCondition (was benötigte where-Bedingungen in Ihre Join-Anweisung hinzufügt).

$products = Product::find()
    ->joinWith(['metaData' => function (ActiveQuery $query) {
        return $query
            ->andWhere(['=', 'meta_data.published_state', 1]);
    }])
    ->joinWith(['availability' => function (ActiveQuery $query) {
        return $query
            ->andOnCondition(['>=', 'availability.start', strtotime('+7 days')])
            ->andWhere(['IS', 'availability.ID', NULL]);
    }])
    ->all();

Außerdem sieht es sauberer aus, wenn Sie where schreiben Klauseln innerhalb von Beziehungen. Es funktioniert genauso wie es außerhalb zu schreiben (wenn ich mich nicht irre), aber wenn Sie Ihre Abfrage umgestalten, können Sie einfach die gesamte Beziehung löschen, ohne die Beziehungsbedingungen außerhalb zu vergessen.