Jag tror att den här är en bättre lösning. Istället för att använda Raw-frågor som leftJoin
du bör komplettera din joinWith
relationer med andOnCondition
(vilket lägger till nödvändiga villkor i ditt sammanfogningsförklaring).
$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();
Dessutom ser det renare ut när du skriver where
klausuler i relationer. Det fungerar på samma sätt som att skriva det utanför (om jag inte har fel), men när du refaktorerar din fråga kan du enkelt ta bort hela relationen utan att glömma relationsvillkor utanför.