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.