Laravel表单请求中如何实现books表联合唯一数据验证?
解决联合唯一验证问题
你当前的验证规则是分别要求书名和作者各自唯一,这显然不符合你要的「同一书名+作者组合不重复」的需求,得改成联合唯一验证,分两步来:
1. 数据库层面加联合唯一索引(关键)
先给数据库表加联合唯一索引,从底层杜绝重复数据,避免程序验证失效的情况:
ALTER TABLE books ADD UNIQUE INDEX idx_book_writer (book_name, writer);
2. 修改Laravel验证规则
用Laravel的Rule类来实现联合验证,替换你原来的rules方法:
use Illuminate\Validation\Rule; public function rules() { return [ 'book_name' => [ 'required', Rule::unique('books') ->where(function ($query) { return $query->where('writer', $this->writer); }) ->ignore($this->id) ], 'writer' => 'required', ]; }
代码说明:
Rule::unique('books')指定要验证的表是bookswhere()闭包里添加了额外条件,要求writer必须和当前请求的作者一致,这样就实现了「书名+作者」组合的唯一验证ignore($this->id)是为了更新数据时,排除当前记录本身,防止更新操作触发唯一验证错误
内容的提问来源于stack exchange,提问作者mahbub
相关产品推荐
相关产品推荐

