Tôi tin rằng một trong những giải pháp này là tốt hơn. Thay vì sử dụng các truy vấn thô như leftJoin
bạn nên bổ sung joinWith
của mình quan hệ với andOnCondition
(bổ sung các điều kiện cần thiết vào câu lệnh tham gia của bạn).
$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();
Ngoài ra, nó trông gọn gàng hơn khi bạn viết where
mệnh đề quan hệ bên trong. Nó hoạt động giống như viết nó bên ngoài (nếu tôi không nhầm), nhưng khi cấu trúc lại truy vấn của bạn, bạn có thể dễ dàng xóa toàn bộ quan hệ mà không quên các điều kiện quan hệ bên ngoài.