yii2多重过滤到搜索模型中

时间:2016-07-20 07:59:04

标签: php mysql yii2 select2

我有这样的数据库结构:

Addresses
id primary key auto_increment
name
surname
email

categories
id primary key auto_increment
name

address_category
id primary key auto_increment
addr_id
cate_id

在gridview上,进入类别过滤器列我已插入一个select2扩展,其中多个设置为true,而在addressesSearch模型中,我添加了此代码:

->andFilterWhere(['address_category.cate_id'=>  $category]

它的功能,但不是我想要的,yii做一个IN查询,如cate_id IN(4,5,6)而不是我需要一个查询,找到标记有所有选定类别的地址。

我希望能很好地解释我的问题

谢谢

3 个答案:

答案 0 :(得分:0)

select2 multiple返回逗号分隔值。首先拆分它,也许检查整数值

->andFilterWhere(['IN', 'address_category.cate_id', array_map('intval', explode(',', $category))]);

答案 1 :(得分:0)

我找到了一个解决方案,我不知道它是否是最好的方式,但是有效。

                $query->select(['addresses.*, (select count(*) as categories from address_category where cate_id IN ('.implode(",",$category).') and addr_id=addresses.id) as categories']);
            $query->having(['categories' =>  count($category)]);        

答案 2 :(得分:0)

我相信 OP 的工作解决方案可能会在查询中使用计算字段,并且这可能与最终对我有用的解决方案相关,因此这可能只是一种替代方法。注意:我尝试了一切来解析/操作属性,但没有任何效果。

因此,使用(getter)在您的模型中创建一个字段,它只是复制属性,因此在一个模型中,该模型在国家/地区表中具有​​一个国家名称的 getter,以 country_id 作为属性,例如:

public function getCountrylink()
{
return $this->country_id;
}

这个(countryLink)然后被用作视图/索引中的属性和modelSearch过滤器中的简单替换:

$query->andFilterWhere(['country_id' => $this->countryLink]);

注意您还需要将 calc 字段添加为公共变量,并将其作为安全条目包含在 modelSearch 的规则中,按照建立计算字段的标准说明(在 GridView 中搜索“按计算/相关字段过滤和排序” Yii 2.0")。