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
相关产品推荐
相关产品推荐

