Saya percaya ini adalah solusi yang lebih baik. Alih-alih menggunakan kueri mentah seperti leftJoin
Anda harus melengkapi joinWith
. Anda hubungan dengan andOnCondition
(yang menambahkan kondisi mana yang diperlukan ke dalam pernyataan bergabung Anda).
$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();
Selain itu terlihat lebih bersih ketika Anda menulis where
klausa di dalam relasi. Ini bekerja sama seperti menulisnya di luar (jika saya tidak salah), tetapi ketika memfaktorkan ulang kueri Anda, Anda dapat dengan mudah menghapus seluruh relasi tanpa melupakan kondisi relasi di luar.