Yii活动查询 - 比较多个值IN数组以获得多对多关系

时间:2017-01-08 11:23:12

标签: php mysql yii

我有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查询以获取具有所有赋予功能的属性。

2 个答案:

答案 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]);