Laravel执行db seed命令报错:Attempt to read property 'client_id' on null 求助
解决数据库填充时"Attempt to read property 'client_id' on null"错误
问题原因
执行db seed命令时,系统处于无用户登录状态,auth()->user()返回null,而你在Contractor模型的creating生命周期钩子中直接访问auth()->user()->client_id,导致调用null对象的属性触发错误。
解决办法
手动在填充时指定client_id
先修改模型的creating钩子,增加判断逻辑,避免覆盖手动传入的client_id:class Contractor extends Model { protected static function booted() { static::creating(function ($model) { // 仅当client_id未设置且存在登录用户时,才从用户获取值 if (empty($model->client_id) && auth()->check()) { $model->client_id = auth()->user()->client_id; } }); } }然后在Seeder文件中创建Contractor时直接传入client_id:
Contractor::create([ // 填写其他必填字段 'client_id' => 1, // 替换为数据库中实际存在的client_id值 ]);填充时模拟登录用户
在Seeder的run方法中先登录一个测试用户,确保auth()->user()有值:use App\Models\User; public function run() { // 创建或获取一个带有client_id的测试用户 $user = User::firstOrCreate( ['email' => 'seed_test@example.com'], [ 'name' => 'Seed Test User', 'password' => bcrypt('123456'), 'client_id' => 1, // 确保该用户存在client_id ] ); // 模拟登录该用户 auth()->login($user); // 执行填充逻辑,比如用工厂创建数据 Contractor::factory()->count(10)->create(); }设置client_id默认值(业务允许的情况)
如果业务允许client_id有默认值,可以修改模型钩子,使用空值合并运算符处理null情况:class Contractor extends Model { protected static function booted() { static::creating(function ($model) { // 优先取登录用户的client_id,不存在则用默认值 $model->client_id = auth()->user()?->client_id ?? 1; // 1替换为你的默认client_id }); } }注意:默认的client_id必须在数据库中真实存在,否则会触发外键约束错误。
内容的提问来源于stack exchange,提问作者Malik Zubair Mukhtar
相关产品推荐
相关产品推荐

