You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 Gii生成CRUD访问view等操作报400缺少id_kategori参数如何解决

结论

不需要修改数据表的id_kategori列以及其他表的自定义主键列名,该问题是Yii 2配置不匹配导致的,按以下步骤修改即可完全解决。


问题根因

错误的核心原因是两处默认配置和你实际的主键名不匹配:

  1. Gii生成CRUD代码时,默认按照主键名为id的规则生成URL参数,GridView的操作按钮默认也只会传递名为id的主键参数,和你控制器动作要求的id_kategori参数名不符
  2. 你的Kategori模型类没有显式声明主键,Yii默认将主键识别为id,无法匹配你实际的主键字段id_kategori

修复步骤

1. 显式声明模型主键

打开models/Kategori.php文件,显式指定主键字段:

class Kategori extends \yii\db\ActiveRecord
{
    // 新增这一行声明主键
    public $primaryKey = 'id_kategori';

    // 原有代码保持不变
}

2. 修正列表页操作按钮的参数

打开views/kategori/index.php,找到GridView配置中的ActionColumn部分,修改URL生成规则,传递正确的参数名:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        // 原有其他列配置保持不变
        [
            'class' => 'yii\grid\ActionColumn',
            'urlCreator' => function ($action, $model, $key, $index) {
                return \yii\helpers\Url::to([$action, 'id_kategori' => $model->id_kategori]);
            }
        ],
    ],
]); ?>

3. 修正新增成功后的跳转逻辑

打开控制器中的actionCreate方法,修改跳转时传递的参数名:

public function actionCreate()
{
    $model = new Kategori();
    if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) {
        // 将原来的'id'改为'id_kategori'
        return $this->redirect(['view', 'id_kategori' => $model->id_kategori]);
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}

可选优化

如果要简化URL格式,可以在frontend/config/main.php的urlManager组件中新增自定义路由规则:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'kategori/<action:view|update|delete>/<id_kategori:\d+>' => 'kategori/<action>',
    ],
],

配置后生成的URL会自动适配id_kategori参数,无需在每个生成URL的地方手动指定参数名。


内容的提问来源于stack exchange,提问作者Dedi Setiawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:45:03