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:Gridview过滤器中的kartik\Select2下拉列表