Laravel创建带外键的模型时自动插入认证用户ID的方法
解决Laravel中通过关联创建项目时自动填充owner_id且无需加入$fillable的问题
你的核心问题是控制器调用的关联方法名与User模型中定义的不匹配,导致Laravel无法自动识别关联关系、填充owner_id字段。以下是两种无需将owner_id加入Project模型$fillable数组的解决方案:
方法一:修正控制器的关联方法调用
直接使用User模型中已定义的projectsOwned()方法创建项目:
public function store(Request $request) { $validatedData = $request->validate([ 'title' => ['required', 'max:255'], ]); // 调用正确的所有者关联方法 auth()->user()->projectsOwned()->create($validatedData); return to_route('projects.index')->with('status', __('Project created successfully!')); }
当通过HasMany关联调用create()方法时,Laravel会自动将当前用户ID赋值给owner_id,这个操作不属于批量赋值范畴,因此无需在$fillable中声明该字段。
方法二:统一关联方法名(避免混淆)
如果希望保留projects()的调用习惯,可以修改User模型的方法命名,同时区分多对多的访问权限关系:
// User模型 // 所有者关联:重命名为projects() public function projects(): HasMany { return $this->hasMany(Project::class, 'owner_id'); } // 多对多访问权限关系:重新命名以区分,比如accessibleProjects() public function accessibleProjects(): BelongsToMany { return $this->belongsToMany(Project::class, 'project_user'); // 替换为你的实际中间表名 }
修改后,控制器中auth()->user()->projects()->create($validatedData)即可正常工作,Laravel会自动填充owner_id字段。
关键原理
通过Laravel的关联关系(如hasMany)调用create()或save()方法时,框架会自动处理外键赋值,该过程绕开了批量赋值检查逻辑,完全满足你不修改$fillable的需求。
内容的提问来源于stack exchange,提问作者Juan Burillo
相关产品推荐
相关产品推荐

