Laravel 8 向数组类型字段追加值时覆盖原有内容问题求解
问题原因
你当前的控制器逻辑每次新增申请人时,没有读取数据库中已存储的申请人数组,而是直接创建了仅包含当前提交user_id的新数组,直接赋值覆盖了旧数据,因此最终数组始终只有一个值。你之前尝试array_push没有生效,也是因为没有先读取已存储的applicants数组,直接往新创建的空数组里push元素,最终还是会覆盖原有数据。
修正后的控制器代码
public function addApplicant($id, Request $reqst){ $job = Recruitment::findOrFail($id); // 读取已有申请人数组,字段为空时初始化空数组 $applicants = $job->applicants ?? []; // 将新的用户ID加入数组 $applicants[] = $reqst->user_id; // 赋值后保存 $job->applicants = $applicants; $job->save(); return redirect()->back(); }
你的applicants字段已经在模型中配置了array类型转换,Laravel会自动处理text存储字段和PHP数组的序列化/反序列化,不需要额外手动处理编码解码操作。
可选优化方案
可以增加重复申请校验,避免同一个用户ID多次存入同一个岗位的申请人数组:
public function addApplicant($id, Request $reqst){ $job = Recruitment::findOrFail($id); $applicants = $job->applicants ?? []; $userId = $reqst->user_id; // 校验用户是否已经申请过 if (!in_array($userId, $applicants)) { $applicants[] = $userId; $job->applicants = $applicants; $job->save(); } return redirect()->back(); }
这里用findOrFail替代原有的find,可以在传入的岗位ID不存在时直接返回404,避免后续调用属性时报错。
内容的提问来源于stack exchange,提问作者Tim Sobrecarey
相关产品推荐
相关产品推荐

