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

Laravel9+模型用UUID作主键时create方法返回id为0的问题

问题解决:Laravel UUID主键create后返回ID为0的问题

问题原因

你已经将数据库主键改为UUID,也设置了$keyType = 'string',但Laravel默认主键为自增整数,默认开启$incrementing = true。调用create方法时,框架会尝试获取自增ID值(而你的UUID并非自增类型),因此返回的模型实例中ID会显示为0,但数据库因设置了默认值,能正确生成UUID。

解决方法

方法1:关闭自增属性

在Game模型中添加$incrementing = false;,明确告知Laravel主键不是自增类型:

class Game extends Model
{
    use HasFactory, HasApiTokens;

    protected $keyType = 'string';
    public $incrementing = false; // 新增该行

    protected $fillable = [
        "title",
        "user_id",
    ];
}

修改后,create方法返回的模型实例将正确从数据库获取生成的UUID。

方法2:在模型中生成UUID(替代数据库默认)

若不想依赖数据库默认值,可在模型boot方法中监听creating事件,手动生成UUID:

use Illuminate\Support\Str;

class Game extends Model
{
    use HasFactory, HasApiTokens;

    protected $keyType = 'string';
    public $incrementing = false;

    protected $fillable = [
        "title",
        "user_id",
    ];

    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->id = Str::uuid();
        });
    }
}

此方式会在调用create前生成UUID,模型实例直接持有正确ID值,无需额外查询数据库。

验证

修改完成后重新调用create方法,用dd($game)查看,ID字段将显示正确的UUID字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:07