Yii2 GridView filterModel报错“必须为整数”,需按用户名搜索
解决GridView按关联表用户名筛选的问题
哈哈,这个问题我之前在项目里也踩过坑!本质是你的GridView默认基于Holidays表的person_id(整数类型)做筛选,但你实际想要用关联表Persons里的用户名来搜索,所以得调整模型关联和搜索逻辑,一步步来:
第一步:确保模型关联正确
先在Holidays.php模型里添加和Persons的关联关系(如果还没加的话):
public function getPerson() { // 一个Holiday对应一个Person,所以用hasOne return $this->hasOne(Persons::class, ['person_id' => 'person_id']); }
第二步:修改搜索模型支持用户名筛选
假设你的搜索模型是SearchHolidays.php,做这几个修改:
- 新增一个用于接收用户名筛选的属性:
public $person_name;
- 在验证规则里允许这个属性作为筛选条件:
public function rules() { return [ // 保留你原有的其他规则 [['person_name'], 'safe'], // 标记为安全的筛选属性 ]; }
- 更新
search()方法,关联Persons表并添加用户名筛选逻辑:
public function search($params) { $query = Holidays::find(); // 关联Persons表,这样才能用它的字段筛选和显示 $query->joinWith(['person']); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); // 可选:配置排序,让点击表头可以按用户名排序 $dataProvider->sort->attributes['person_name'] = [ 'asc' => ['Persons.person_name' => SORT_ASC], 'desc' => ['Persons.person_name' => SORT_DESC], ]; $this->load($params); if (!$this->validate()) { return $dataProvider; } // 保留你原有的其他筛选条件... // 添加用户名的模糊筛选 $query->andFilterWhere(['like', 'Persons.person_name', $this->person_name]); return $dataProvider; }
第三步:调整GridView的列配置
把原来显示person_id的列替换成关联的用户名列,并且绑定到新的筛选属性:
echo GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ // 保留你的其他列... [ 'attribute' => 'person_name', // 绑定到搜索模型里的person_name属性 'label' => '用户名', 'value' => function ($model) { // 从关联模型里取用户名 return $model->person->person_name; }, ], // 保留你的其他列... ], ]);
这样改完之后,GridView里的列会正常显示用户名,筛选框也会按用户名的字符串做模糊搜索,不会再出现“Persons must be an integer”的错误啦。
哦对了,如果你的框架不是Yii2,核心思路也是通用的:让搜索逻辑关联到关联表,添加关联表字段的筛选条件,同时修改列表的列配置,绑定到关联字段的筛选属性。
内容的提问来源于stack exchange,提问作者Roby Sottini
相关产品推荐
相关产品推荐

