Laravel模型能否为单个字段添加两个exists验证规则?
实现unit_of_measure字段匹配units表的abbreviation或name验证
你给出的代码写法不可行,因为数组中重复的键名会被后面的规则覆盖,实际只会生效最后一条exists:units,name的验证。要实现同时匹配abbreviation或name字段的存在性验证,有两种常用方案:
方案一:使用Laravel内置Rule类构造复合查询
利用Rule::exists()结合闭包添加OR条件,直接在验证规则里实现逻辑:
use Illuminate\Validation\Rule; // 验证规则定义 $rules = [ 'unit_of_measure' => [ 'required', 'string', 'max:255', Rule::exists('units')->where(function ($query) use ($request) { $query->where('abbreviation', $request->unit_of_measure) ->orWhere('name', $request->unit_of_measure); }), ], ];
方案二:自定义验证规则
如果需要复用这个验证逻辑,或者逻辑更复杂,可以创建自定义规则:
- 生成自定义规则文件:
php artisan make:rule CheckUnitExists
- 在生成的
app/Rules/CheckUnitExists.php中编写验证逻辑:
namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use App\Models\Unit; class CheckUnitExists implements Rule { public function passes($attribute, $value) { // 查询units表是否存在匹配abbreviation或name的记录 return Unit::where('abbreviation', $value) ->orWhere('name', $value) ->exists(); } public function message() { return '所选的计量单位无效。'; } }
- 在验证规则中使用自定义规则:
use App\Rules\CheckUnitExists; $rules = [ 'unit_of_measure' => [ 'required', 'string', 'max:255', new CheckUnitExists, ], ];
两种方案都能实现需求:方案一适合简单场景,代码更紧凑;方案二更灵活,便于在多个地方复用验证逻辑。
内容的提问来源于stack exchange,提问作者Paul Preibisch
相关产品推荐
相关产品推荐

