Laravel如何防止用户重复投递职位时数据库产生重复数据
问题根因
- 你对Laravel
firstOrNew()方法的传参规则理解有误:- 第一个参数是全部匹配条件,方法会基于这些字段联合查询是否存在对应记录
- 第二个参数是新建记录时需要额外赋值的字段(如果匹配不到记录的话)
- 第一次代码错误:只把
user_id放在匹配条件里,相当于只要当前用户有过任何投递记录,就不会新建申请,自然无法投递其他职位 - 第二次代码错误:
- 用
&&连接两个数组,PHP中数组做逻辑运算返回的是布尔值,完全不符合方法参数要求 - 多传了第三个参数,
firstOrNew()仅接受2个参数 request(Auth::id())写法错误,Auth::id()已经是当前登录用户的ID,不需要再从请求参数里取
- 用
正确实现代码
// 联合匹配 同一个用户+同一个职位 的申请记录 $apply = Applies::firstOrNew([ 'user_id' => Auth::id(), 'posts_id' => request('id') ]); // 存在则直接返回已有实例,不存在则新建后保存 $apply->save();
如果需要给申请记录加其他默认字段(比如申请时间、状态之类的),可以放在第二个参数里:
$apply = Applies::firstOrNew( [ 'user_id' => Auth::id(), 'posts_id' => request('id') ], [ 'status' => 1, // 示例:申请状态默认待审核 'apply_time' => now() ] ); $apply->save();
兜底优化建议
为了避免代码逻辑漏洞导致脏数据,建议在数据库层给applies表加user_id和posts_id的联合唯一索引:
ALTER TABLE `applies` ADD UNIQUE INDEX `idx_user_post` (`user_id`, `posts_id`);
内容的提问来源于stack exchange,提问作者Fatih Can
相关产品推荐
相关产品推荐

