根据所选选项更改存在规则

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)

以上是关于根据所选选项更改存在规则的主要内容,如果未能解决你的问题,请参考以下文章

更改所选选项时,选择值不会更改

如何根据所选选项的高度调整选择菜单的大小?

如何使用 jQuery 检查所选选项的更改? [复制]

使用 jQuery 更改所选选项 [重复]

如何使用 ajax 更改所选选项 [关闭]

AngularJS 根据预定义的值更改 SELECT 列表中的选定选项