yii2多重过滤进入搜索模型


yii2 multiple filter into search model

我有这样的数据库结构:

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上,在categories filter列中,我插入了一个select2扩展名,其中多个设置为true,在addressesSearch模型上,我添加了以下代码:

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

它起作用,但不像我想要的那样,我做了一个像cate_id IN(4,5,6)这样的IN查询,相反,我需要一个查询来找到标记了所有所选类别的地址。

我希望已经很好地解释了我的问题

感谢

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

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

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

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

我相信OP的工作解决方案可能会在查询中使用一个计算字段,这可能与最终对我有效的解决方案有关,所以这可能只是一种替代方法。注意:我尝试了所有解析/操作属性的方法,但都没有成功。

因此,在您的模型中使用(getter)创建一个字段,该字段只需复制属性,因此,在一个国家表中,以Country_id为属性的Country名称具有getter的模型中,类似于:

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

然后,此(countryLink)用作视图/索引中的属性,并用作模型搜索筛选器中的简单替换:

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

N。B.您还需要将calc字段添加为公共变量,并根据建立计算字段的标准说明(在GridView Yii 2.0中搜索"Filter&Sort by computed/related fields")将其作为安全条目包含在modelSearch的规则中。