yii2 多重过滤器进入搜索模型

Posted

技术标签:

【中文标题】yii2 多重过滤器进入搜索模型【英文标题】:yii2 multiple filter into search model 【发布时间】:2016-11-23 08:29:49 【问题描述】:

我有一个这样的数据库结构:

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 做一个像 cate_id IN (4,5,6) 这样的 IN 查询,而不是我需要一个查询来找到标记有所有选定类别的地址。

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

谢谢

【问题讨论】:

$query->andFilterWhere(['IN', 'address_category.cate_id',$category]); 您发布的这段代码与我已经发布的代码相同。我试图更好地解释,如果我选择类别客户和发票,我只想搜索标记有客户和发票的地址,甚至不搜索现在正在发生的客户和法律或客户和技术。谢谢 试试 ->andFilterWhere(['address_category.cate_id'=> $category])->andFilterWhere(['count(address_category.cate_id)'=>count($category)]);跨度> 语法错误,意外的 '‌​' (T_STRING),需要 ']' 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我找到了解决方案,我不知道是否是最好的方法,但可行。

                $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)]);        

【讨论】:

【参考方案3】:

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

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

public function getCountrylink()

return $this->country_id;

这个 (countryLink) 然后用作视图/索引中的属性,并作为模型搜索过滤器中的简单替换:

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

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

【讨论】:

以上是关于yii2 多重过滤器进入搜索模型的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 GridView - 将搜索过滤器更改为onchange事件而不是提交

Yii2:如何为模型类动态添加验证规则?

Yii2:Gridview过滤器中的kartik\Select2下拉列表

Yii2 GridView 按年份过滤日期

Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)

具有逗号的多重过滤的数据表