我有这样的数据库结构:
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的规则中。