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作为主键参数名,选以下任意一种方式修改即可:- 最简配置:指定
primaryParam属性
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ // 其他字段列省略 [ 'class' => 'yii\grid\ActionColumn', 'primaryParam' => 'code' ], ], ]); ?>- 自定义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
相关产品推荐
相关产品推荐

