Laravel 11中Auth::attempt()无法保存数据库会话问题求助
问题原因
报错核心是Laravel默认生成的会话ID格式与你定义的sessions表id字段的UUID类型不匹配。你将sessions.id设为PostgreSQL的uuid类型,但Laravel默认生成的会话ID是40位随机字符串(如gI1HNhCI1bLFxLMkANIHJUi4t3sANFrdaDpO0jCi),不符合PostgreSQL对UUID格式(36位带连字符,如550e8400-e29b-41d4-a716-446655440000)的要求,导致SQL执行失败。
解决方案
1. 配置Laravel生成标准UUID格式的会话ID
修改config/session.php文件,添加id_generator配置项,指定用Laravel的UUID生成器生成会话ID:
return [ // 其他原有配置... 'driver' => 'database', 'id_generator' => fn () => Illuminate\Support\Str::uuid()->toString(), ];
或者在app/Providers/AppServiceProvider.php的boot方法中全局设置会话ID生成规则:
use Illuminate\Support\Str; use Illuminate\Session\Middleware\StartSession; public function boot() { StartSession::useIdGenerator(fn () => Str::uuid()->toString()); }
2. 确保用户模型的UUID配置正确
确认你的User模型已正确设置UUID作为主键:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class User extends Model { public $incrementing = false; protected $keyType = 'uuid'; protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->id)) { $model->id = Str::uuid(); } }); } }
3. 清除旧会话数据
执行Artisan命令清除所有旧的非UUID格式会话,避免残留数据干扰:
php artisan session:clear
验证
完成以上配置后重新调用登录接口,Auth::attempt()应该能正常完成会话创建,不会再出现UUID格式错误。
内容的提问来源于stack exchange,提问作者jmakinin
相关产品推荐
相关产品推荐

