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

Yii2使用非id自定义主键时Gii生成CRUD代码的适配问题

解决方案

你只需要按以下步骤修改代码即可适配自定义主键场景:

  • 步骤1:手动指定Model的主键
    Yii2 ActiveRecord默认会自动读取数据表主键,但若存在表结构缓存、Gii生成异常的情况,会导致主键识别错误。你可以在Country2模型类中手动重写主键方法,强制指定主键字段:
class Country2 extends \yii\db\ActiveRecord
{
    // 其他自动生成的代码省略

    public static function primaryKey()
    {
        return ['code'];
    }
}
  • 步骤2:修正控制器的动作参数
    Gii自动生成的控制器动作(view/update/delete)默认接收$id参数,需要同步替换为$code和主键字段对应:
// 原有写法
public function actionView($id)
public function actionUpdate($id)
public function actionDelete($id)

// 修改后写法
public function actionView($code)
public function actionUpdate($code)
public function actionDelete($code)

你已经调整过的findModel方法保持现有写法即可。

  • 步骤3:修改GridView操作列的参数配置
    自动生成的GridView中ActionColumn默认使用id作为主键参数名,选以下任意一种方式修改即可:
    1. 最简配置:指定primaryParam属性
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            // 其他字段列省略
            [
                'class' => 'yii\grid\ActionColumn',
                'primaryParam' => 'code'
            ],
        ],
    ]); ?>
    
    1. 自定义url生成(适合有特殊URL规则的场景)
    [
        'class' => 'yii\grid\ActionColumn',
        'urlCreator' => function ($action, $model, $key, $index) {
            return \yii\helpers\Url::to([$action, 'code' => $model->code]);
        }
    ]
    

注意事项

如果开启了URL伪静态美化功能,需要同步修改config/web.php中UrlManager的匹配规则,把原来匹配id的规则调整为匹配code字段。修改后如果不生效,删除runtime/cache目录下的表结构缓存即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:15:01