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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:46:15