Yii2 kartik GridView的getSelectedRows针对无主键MySQL视图始终返回空怎么办
问题原因
getSelectedRows 方法本质是读取GridView每行<tr>标签的data-key属性值,这个属性值来源于数据提供者(DataProvider)对应模型的主键。你使用的是MySQL视图,Yii的ActiveRecord默认无法从视图元数据中读取到主键定义,因此生成行的时候不会写入data-key,最终导致方法返回空数组。
解决步骤
情况1:使用ActiveDataProvider加载视图数据
给视图对应的ActiveRecord模型手动指定主键即可,打开你这个视图对应的AR类,重写primaryKey()方法,返回能唯一标识一行数据的字段(支持单个字段或联合主键的多个字段):
// 你的视图对应的模型类,示例类名为PendingAd class PendingAd extends \yii\db\ActiveRecord { // 新增这个方法手动指定主键 public static function primaryKey() { // 单个主键直接返回单元素数组,联合主键返回多个元素即可,比如['ad_id', 'publisher_id'] return ['ad_id']; } // 其他原有代码保持不变 public static function tableName() { return '你的视图表名称'; } }
情况2:使用ArrayDataProvider加载视图数据
不需要修改模型,直接在数据提供者的配置里指定key参数为你要作为唯一标识的字段:
$dataProvider = new \yii\data\ArrayDataProvider([ 'allModels' => $yourViewData, 'key' => 'ad_id', // 替换为你视图中能唯一标识行的字段 // 其他原有配置如分页、排序等保持不变 ]);
可选检查项
确认你的$gridColumns配置中已经引入了复选框列,示例配置如下:
$gridColumns = [ // 开头添加复选框列 [ 'class' => 'kartik\grid\CheckboxColumn', // 无需额外配置,主键设置正确后会自动关联行标识 ], // 其他原有列配置保持不变 // ... ];
验证效果
配置完成后刷新页面,检查GridView的行标签<tr>是否已经生成了data-key属性,此时再调用var keys = $('#pending-ads-grid').yiiGridView('getSelectedRows');即可正常获取选中行的主键值。
内容的提问来源于stack exchange,提问作者Emzyn pvt ltd
相关产品推荐
相关产品推荐

