Laravel 10中设置slug为主键时getKeyName引发测试异常
Laravel 10 自定义主键(slug)导致字段值被覆盖的问题解决
问题原因
当你通过getKeyName()将slug设为模型主键时,Laravel默认沿用自增整数主键的逻辑:
- 框架默认
$incrementing = true(主键自增)、$keyType = 'int'(主键类型为整数) - 这会导致框架自动用自增数值(也就是你看到的
9)覆盖你传入的slug值,把它当成自增主键来填充
解决步骤
需要在模型中明确修改主键配置,告诉Laravel这是一个非自增的字符串主键:
1. 修改模型配置
在你的模型类中添加以下配置(两种方式二选一即可):
class YourModel extends Model { // 方式一:直接设置主键属性 protected $primaryKey = 'slug'; public $incrementing = false; // 关闭自增特性 protected $keyType = 'string'; // 指定主键为字符串类型 // 方式二:保留getKeyName方法,同时补充另外两个配置 // public function getKeyName(): string // { // return 'slug'; // } // public $incrementing = false; // protected $keyType = 'string'; }
2. 确认数据库字段配置
确保数据库中的slug字段满足:
- 设置为主键
- 字段类型为字符串(比如
VARCHAR(255)) - 开启唯一约束(避免重复slug)
- 不要设置为自增类型
验证效果
修改后重新执行创建代码:
$modelInstance = YourModel::create([ 'title' => 'Old Title', 'slug' => Str::slug('Old Title'), 'description' => 'Old description', 'rating' => 4.2, ]);
此时slug字段会正常保存为old-title,不会被自增数值覆盖。
内容的提问来源于stack exchange,提问作者devsead
相关产品推荐
相关产品推荐

