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.