Вярвам, че това е по-доброто решение. Вместо да използвате необработени заявки като leftJoin
трябва да допълните своя joinWith
отношения с andOnCondition
(което добавя необходими условия към вашето изявление за присъединяване).
$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();
Освен това изглежда по-чисто, когато напишете where
клаузи вътре в отношенията. Работи по същия начин като записването му отвън (ако не греша), но когато рефакторирате заявката си, можете лесно да изтриете цялата релация, без да забравяте условията на релацията отвън.