我有这样的数据库结构:
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)而不是我需要一个查询,找到标记有所有选定类别的地址。
我希望能很好地解释我的问题
谢谢
答案 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")。