Laravel 8 User与JobPost模型关联配置、数据输出及入库问题
问题修复与解答
先修正现有代码的基础错误
你当前的代码存在几个基础问题,会直接导致运行报错,需要先修复:
- 关联方法漏写return:Laravel的关联方法必须return关联实例,否则返回null会报调用方法错误
- 关联名调用不匹配:User模型中定义的关联名为复数
jobposts,你在控制器中调用的是单数jobpost(),会报方法不存在 - where条件位置错误:你在User的hasMany关联中加的
where('account_type', 'profile'),默认会查询job_posts表的account_type字段,但该字段属于users表,逻辑错误 - 迁移文件拼写错误:
contrained()应为constrained(),拼写错误会导致外键创建失败
问题1:如何正确使用dd测试关联数据
调用关联时加括号()返回的是查询构造器实例,不能直接读取模型属性,有两种正确写法:
- 读取关联属性(自动执行查询返回结果):
// 打印当前用户的所有职位列表 dd(auth()->user()->jobposts); // 打印第一条职位的job_name,加?->避免无数据时报错 dd(auth()->user()->jobposts->first()?->job_name);
- 手动通过查询构造器执行查询:
dd(auth()->user()->jobposts()->first()?->job_name);
问题2:如何正确通过关联写入数据
前置准备
首先在JobPost.php中添加批量赋值白名单,避免MassAssignmentException错误:
protected $fillable = ['job_name', 'describe_work', 'job_category', 'city', 'state', 'zip'];
然后修正User.php的关联定义:
public function jobposts() { // 不需要在关联内加account_type筛选,调用前判断用户类型更合理 return $this->hasMany(JobPost::class); }
正确的store方法写法
public function store(Request $request) { $validated = $this->validate($request, [ 'job_name' => 'required|max:100', 'describe_work' => 'required|max:800', 'job_category' => 'required|not_in:0', 'city' => 'required|not_in:0', 'state' => 'required|not_in:0', 'zip' => 'required|regex:/\b\d{5}\b/', ]); // 校验用户权限,仅account_type为profile的用户可发布职位 if ($request->user()->account_type !== 'profile') { abort(403, '无权限发布职位'); } // 直接用验证后的数据创建职位,自动关联当前用户 $jobPost = $request->user()->jobposts()->create($validated); // 如需测试创建结果可取消注释 // dd($jobPost); return redirect()->back()->with('success', '职位发布成功'); }
可选:关联内限制用户类型
如果你需要在JobPost的关联中自动筛选profile类型的用户,修正关联写法如下:
// JobPost.php public function userprofile() { // 指定表名避免字段歧义 return $this->belongsTo(User::class)->where('users.account_type', 'profile'); }
内容的提问来源于stack exchange,提问作者Ginz77
相关产品推荐
相关产品推荐

