根据所选选项更改存在规则
Posted
技术标签:
【中文标题】根据所选选项更改存在规则【英文标题】:Changing exists rule based on choosen option 【发布时间】:2020-06-03 03:01:52 【问题描述】:所以我有这个简单的代码来根据注册表中的数据库值输入值,它工作得很好,
下面的代码位于register.blade.php
这个用于选择分支
<div class="form-group form-material floating">
<select class="form-control" name="branch" id="branch">
<option value="1">Option A</option>
<option value="2">Option B</option>
</select>
<label class="floating-label" for="inputStatus">Branch</label>
</div>
这个用于输入参考
<div class="form-group form-material floating $errors->has('reference') ? ' has-error' : '' ">
<input type="text" class="form-control empty" id="reference" name="reference">
<label class="floating-label" for="inputStatus">Reference</label>
@if ($errors->has('reference'))
<span class="help-block">
<strong> $errors->first('reference') </strong>
</span>
@endif
</div>
下面的代码位于RegisterController.php
还有这个用于验证
protected function validator(array $data)
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'phone' => 'required|string|min:5|max:20',
'rate' => 'required',
'product' => 'required',
'branch' => 'required',
'reference' => [
'required',
Rule::exists('references')->where(function ($query)
if( 'branch' == 1 )
$query->where('references.type', '=', "TOP");
else
$query->where('references.type', '=', "BOTTOM");
),
],
]
);
在注册表中,当用户选择分支上的第一个选项时,用户只能写(例如:'ABC','DEF','GHI')如果用户写另一个值,它将返回错误消息:'错误引用code',但是当用户在分支上选择第二个选项时,用户只能写(例如:'123','456','789'),有没有人知道该怎么做?谢谢
编辑 1: 上面的代码可以正常工作,但是引用的存在规则不起作用,用户在选择第二个选项时仍然可以输入“ABC”、“DEF”或“GHI”。
编辑 2:
我在 register.blade.php
中也有这个自定义验证
fields:
reference:
validators:
notEmpty:
message: 'Reference must be filled'
,
stringLength:
max: 8,
message: 'Max 8 character'
【问题讨论】:
【参考方案1】:为此,您需要自定义验证 .Custom Validation 。而关于查询,你可以在里面做到这一点
public function passes($attribute, $value)
//value will have your reference value
//Logic here and return true/false
public function message()
//error message
//return "The :attribute value doesnt exist.";
如果你想在自定义规则中传递参数,那么你需要使用构造函数并使用它。即
protected $customParams;
public function __construct($customParams)
$this->customParams = $customParams;
规则看起来像这样
'reference' => ['required',new CustomRule('customvalue')]
希望这会有所帮助。
【讨论】:
有没有办法在不创建自定义验证的情况下做到这一点? 服务器端验证..检查一旦通过验证,即`public function store(Request $request) //这里的逻辑并返回 session::flash(error_msg) 并在刀片中捕获会话. `【参考方案2】:您可以进行自定义验证。所以你可以在你的自定义验证中移动这个额外的验证。也许它可以解决你的问题。
更多关于自定义验证的信息:Laravel custom validation
希望对你有帮助:)
【讨论】:
但是如何更改我想使用的查询?,示例(当用户选择第一个选项时,它将选择查询 A .. 但当用户选择选项二时,它将选择查询 B)以上是关于根据所选选项更改存在规则的主要内容,如果未能解决你的问题,请参考以下文章