Laravel自定义FormRequest新增更新共用时如何让unique规则排除当前行
问题解决方案
你可以通过动态判断当前请求的类型,为新增和更新场景生成不同的校验规则,具体调整如下:
1 修正逻辑说明
你原有规则存在两个问题:
unique规则的忽略参数应该传入要跳过的记录主键ID,而非isbn13本身- 静态写死的规则无法适配新增、更新两种场景,需要根据请求方法动态拼接规则
2 调整后的完整代码
class BookRequest extends FormRequest { public function rules() { // 先定义公共基础规则 $baseRules = [ 'isbn13' => ['required', 'digits:13'] ]; // 新增场景(POST请求):校验全表isbn13唯一 if ($this->isMethod('post')) { $baseRules['isbn13'][] = 'unique:App\Models\Product,isbn13'; } // 更新场景(PUT/PATCH请求):忽略当前要修改的记录,避免重复报错 if ($this->isMethod('put') || $this->isMethod('patch')) { // 假设路由为 /books/{book} 形式,通过隐式模型绑定获取当前要更新的产品ID $currentProductId = $this->route('book')->id; // 拼接忽略当前记录的unique规则 $baseRules['isbn13'][] = 'unique:App\Models\Product,isbn13,' . $currentProductId; } return $baseRules; } }
3 补充说明
- 如果你的路由参数名不是
book,比如为{product},请将$this->route('book')替换为$this->route('product') - 如果你没有使用隐式模型绑定,而是将记录ID放在请求参数中传递,可以用
$this->input('id')获取要更新的记录ID - 你也可以使用
Rule类实现更清晰的写法,可读性更高:
// 顶部先引入Rule类 use Illuminate\Validation\Rule; // 更新场景的unique规则可改写为 $baseRules['isbn13'][] = Rule::unique('products', 'isbn13')->ignore($currentProductId);
内容的提问来源于stack exchange,提问作者user2301515
相关产品推荐
相关产品推荐

