これがより良い解決策だと思います。 leftJoin
のようなRawクエリを使用する代わりに joinWith
を補完する必要があります andOnCondition
との関係 (これにより、必要なwhere条件がjoinステートメントに追加されます)。
$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
と書くと、見た目がすっきりします。 リレーション内の句。外部に書き込むのと同じように機能しますが(私が間違っていない場合)、クエリをリファクタリングするときに、外部の関係条件を忘れることなく、関係全体を簡単に削除できます。