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

Laravel数据库条件验证:指定Post类型下Name字段唯一

没问题,这在Laravel里可以通过条件验证结合Rule类轻松实现,我给你两种可行的方案:

方案一:使用带条件的唯一验证规则

这种方法把所有验证逻辑整合在一个规则数组里,更紧凑:

use Illuminate\Validation\Rule;

$this->validate($request, [
    'title' => 'required|max:191',
    'name' => [
        'required',
        'max:191',
        Rule::unique('lcf_posts')
            // 限定只在相同post_type的记录中检查name唯一性
            ->where(fn ($query) => $query->where('post_type', $request->post_type))
            // 仅当post_type等于目标值时启用唯一验证,否则忽略
            ->when($request->post_type === 'example_post_type_name', 
                fn ($rule) => $rule,
                fn ($rule) => $rule->ignore(true)
            )
    ],
    'status' => 'required|max:191',
    'post_type' => 'required|max:191', // 务必验证post_type字段,避免请求中缺失导致逻辑错误
]);
方案二:动态添加验证规则

这种方法逻辑更直观,先做基础验证,再根据post_type的值追加唯一验证:

use Illuminate\Validation\Rule;

// 先执行基础字段验证
$this->validate($request, [
    'title' => 'required|max:191',
    'name' => 'required|max:191',
    'status' => 'required|max:191',
    'post_type' => 'required|max:191',
]);

// 当post_type是目标值时,额外校验name的唯一性
if ($request->post_type === 'example_post_type_name') {
    $this->validate($request, [
        'name' => Rule::unique('lcf_posts')
            ->where(fn ($query) => $query->where('post_type', $request->post_type))
    ]);
}

额外提示(更新场景)

如果这是编辑帖子的逻辑,需要忽略当前帖子本身的记录,避免验证时和自己冲突,只需在Rule::unique后追加->ignore($post->id)即可:

Rule::unique('lcf_posts')->ignore($post->id)->where(...)

内容的提问来源于stack exchange,提问作者Courses Cart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:13:31