You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:54:04