我有table属性和property_has_feature
property_has_feature表看起来像这样。
+-------------+--------------+
| property_id | feature_code |
+-------------+--------------+
| 111 | PENT |
| 122 | GREEN |
| 122 | HFLO |
| 123 | CCAR |
| 111 | CCAR |
| 111 | XBLKV |
| 122 | MFLO |
| 122 | HFLO |
| 111 | BILL |
| 122 | CCAR |
+-------------+--------------+
我想要具有一组功能的属性列表。
例如,我想要具有PENT,CCAR和BILL功能的属性。这应该给我一个id为111的属性,就像提到的所有3个特性一样。
我尝试了以下内容,
$featureCodes = ['PENT', 'CCAR', 'BILL'];
$query = Property::find()
->where(['status'=> '1'])
->joinWith('propertyHasFeatures')
->andWhere(['property_has_feature.feature_code'=>$featureCodes]);
但是这不会产生预期的结果,而是返回至少具有数组中指定的功能的所有属性。
如何编写Active查询以获取具有所有赋予功能的属性。
答案 0 :(得分:0)
这就是答案。 这有点棘手,你不会用简单的IN子句得到它。即使属性具有列表中的某个功能,它也会返回属性。我们需要的是具有给定数组中所有特征的属性。
$featureCodes = ['PENT', 'CCAR', 'BILL'];
$query = Property::find()
->where(['status'=> '1'])
->joinWith('propertyHasFeatures')
->andWhere(['property_has_feature.feature_code'=>$featureCodes])
->groupBy('property.id')
->having(' count(distinct property_has_feature.feature_code) = '.count($featureCodes));
答案 1 :(得分:-1)
$ featureCodes是一个数组,因此您必须在IN子句
中传递它将您的andWhere条件更改为
$featureCodes = ['PENT', 'CCAR', 'BILL'];
$query = Property::find()
->where(['status'=> '1'])
->joinWith('propertyHasFeatures')
->andWhere(['IN','property_has_feature.feature_code',$featureCodes]);