laravel 招聘平台可以给职位 id 和用户 id 建联合唯一索引,再用 firstorcreate() 复用已有投递。同一用户重复投递时,数据库只保留一条记录。
用数据库唯一约束兜底
示例使用 Laravel 12。假定 job_applications 已有非空的 job_id、user_id、status 和时间戳。给已有表加索引前先检查历史重复记录。
Schema::table('job_applications', function (Blueprint $table): void {
$table->unique(['job_id', 'user_id']);
});

把代码放进迁移的 up 方法,导入 Schema 和 Blueprint。对应的 down 方法可用 dropUnique 移除索引。
让重复请求返回已有投递
下面是已有认证路由的控制器方法。投递策略需确认职位开放且账号有投递权限。JobApplication 模型应允许写入代码明确提供的三个字段。
public function store(\Illuminate\Http\Request $request, \App\Models\Job $job)
{
\Illuminate\Support\Facades\Gate::authorize('apply', $job);
$application = \App\Models\JobApplication::firstOrCreate(
['job_id' => $job->id, 'user_id' => $request->user()->id],
['status' => 'submitted']
);
return response()->json(
['id' => $application->id],
$application->wasRecentlyCreated ? 201 : 200
);
}

Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
用户 ID 来自认证会话。重复请求读取旧投递,不重置审核状态。
用同一账号提交两次
在功能测试中准备开放职位和有权限的求职账号。下面假定 POST 路由使用职位模型绑定。
$url = "/jobs/{$job->id}/applications";
$first = $this->actingAs($candidate)->postJson($url)->assertCreated();
$this->postJson($url)->assertOk()->assertJsonPath('id', $first->json('id'));
另外检查该职位和该用户的投递记录只有一条。上线前也可对同一组合做并发测试,确认唯一约束生效。










