比较Yii2搜索

时间:2016-12-24 10:22:36

标签: php mysql search yii2


我正在Yii2中开发REST API。在搜索查询中我想实现这个

 WHERE ((`variant_name` LIKE '%size%' AND `variant_value` 
 LIKE '%12%') OR (`variant_name` LIKE '%color%' AND `variant_value` LIKE '%12%'))

variant_name和variant_value是URL中发送的数组。 我现在正在使用的相应的Yii2代码如下

$query->andFilterWhere(['or',
['or like', 'pvo.variant_name', $this->variant_name],
['or like', 'pvo.variant_value', $this->variant_value]])
 ->groupBy(['pvo.product_variant_id'])
 ->having(['count(product_variant_id)' => count($this->variant_name)]);
        ;

哪个生成以下SQL

AND ((`variant_name` LIKE '%size%' OR .`variant_name` LIKE '%color%')
 OR (`variant_value` LIKE '%13%' OR `variant_value` LIKE '%56%')))

但我希望varaint_name [0]和varaint_value [0]在具有AND条件的单括号中与varaint_name [1]和varaint_value [1]如上所述。 请指导我如何在Yii2中解决这个问题?

更新1 示例网址 http://localhost:8080/online-malls/api/web/v1/products?expand=product_variant_options&variant_name[0]=size&variant_value[0]=13&variant_name[1]=color&variant_value[1]=56

1 个答案:

答案 0 :(得分:1)

如果你在get中使用数组,那么你应该在param中使用数组值,例如:

  $query->andFilterWhere(['or',
    ['or like', 'pvo.variant_name', $this->variant_name[0]],
    ['or like', 'pvo.variant_value', $this->variant_value[0]], 
    ['or like', 'pvo.variant_name', $this->variant_name[1]],
    ['or like', 'pvo.variant_value', $this->variant_value[1]],
    ])
     ->groupBy(['pvo.product_variant_id'])
     ->having(['count(product_variant_id)' => count($this->variant_name)]);