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