Laravel如何实现多个指定字段仅且必须填写其中一个的验证规则
你可以在原有required_without_all规则的基础上,补充Laravel内置的prohibits规则实现需求,该规则的作用是:只要当前字段有值,就禁止prohibits后声明的其他字段存在值,刚好满足「仅允许填写一个」的限制。
修改后的验证规则如下:
public function rules() { return [ "isFlat" => "required_without_all:isDetachedHouse,isTerrace,isSemiDetached|prohibits:isDetachedHouse,isTerrace,isSemiDetached", "isDetachedHouse" => "required_without_all:isFlat,isTerrace,isSemiDetached|prohibits:isFlat,isTerrace,isSemiDetached", "isTerrace" => "required_without_all:isFlat,isDetachedHouse,isSemiDetached|prohibits:isFlat,isDetachedHouse,isSemiDetached", "isSemiDetached" => "required_without_all:isFlat,isDetachedHouse,isTerrace|prohibits:isFlat,isDetachedHouse,isTerrace", "finishQuality" => [ "required", Rule::in(["luxury", "standard", "economy"]) ], ]; }
如果你使用的Laravel版本低于8.x(prohibits规则为8.x版本新增),可以通过闭包自定义验证实现相同效果:
public function rules() { // 定义互斥字段集合 $exclusiveFields = ['isFlat', 'isDetachedHouse', 'isTerrace', 'isSemiDetached']; // 统计已填写的互斥字段数量 $filledExclusiveCount = count(array_filter(request()->only($exclusiveFields))); // 复用的互斥校验闭包 $exclusiveValidate = function ($attribute, $value, $fail) use ($filledExclusiveCount) { if ($filledExclusiveCount > 1) { $fail('房屋类型仅允许选择一项'); } }; return [ "isFlat" => [ "required_without_all:isDetachedHouse,isTerrace,isSemiDetached", $exclusiveValidate ], "isDetachedHouse" => [ "required_without_all:isFlat,isTerrace,isSemiDetached", $exclusiveValidate ], "isTerrace" => [ "required_without_all:isFlat,isDetachedHouse,isSemiDetached", $exclusiveValidate ], "isSemiDetached" => [ "required_without_all:isFlat,isDetachedHouse,isTerrace", $exclusiveValidate ], "finishQuality" => [ "required", Rule::in(["luxury", "standard", "economy"]) ], ]; }
内容的提问来源于stack exchange,提问作者Muhammad Hassan Javed
相关产品推荐
相关产品推荐

