[筆記]Laravel自訂驗証挸則->多個欄位及值驗証Unique

Laravel自訂Unique驗証規則

需求如下

Table Name:tblDataType,有欄位CompanyID,DataType,DataCode,Content

DataType被定義成A/B/C/D四種,需求為同一個CompanyID及DataType的DataCode不可以一樣,所以同一CompanyID下,DataCode相同可以有四個,因為DataType不一樣

在Laravel寫Request時,要檢查唯一直,但內建的Unique達不到我的要求,只好上網查查怎麼寫自訂驗証規則了,寫好就趕快自我筆記一下,免得日後又忘了

我的需求如下

Table Name:tblDataType,有欄位CompanyID,DataType,DataCode,Content

DataType被定義成A/B/C/D四種,需求為同一個CompanyID及DataType的DataCode不可以一樣,所以同一CompanyID下,DataCode相同可以有四個,因為DataType不一樣

接下來就開始寫自訂驗証啦,但小人是PHP初學者,所以寫的方式大概都不太聰明

第一步,Provider

<?php
namespace JoContract\Services\WDASValidation;

use Illuminate\Support\ServiceProvider;
class ValidationServiceProvider extends ServiceProvider {
    
    public function register() {
        
    }
    public function boot()
    {
        // Need to override the default validator with our own validator
        // We can do that by using the resolver function
        $this->app->validator->resolver(function ($translator, $data, $rules, $messages)
        {
            // This class will hold all our custom validations
            return new WDASCustomValidation($translator, $data, $rules, $messages);
        });
    }    
}

第二步,寫驗証內容了,這裡寫的是不止傳二個,看要傳幾個都可以喔

補充一下,$attribute就是你驗証的欄位名稱,$value就是你Form上輸入的值

<?php
namespace JoContract\Services\WDASValidation;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Validator;
class WDASCustomValidation extends Validator {

    public function validateUniqueManyKey($attribute,$value,$parameters) {        
        $parcount=count($parameters);
        
        if ($parcount>0 ) {    //表示多Key要判斷
            $result = DB::table($parameters[0])->where($attribute,'=',$value)
                    ->where(function($query) use ($parcount,$parameters) {
                        $val=1;
                        while ($val < $parcount)
                        {                          
                            $query=$query->where($parameters[$val],'=',$parameters[$val+1]);                        
                            $val=$val+2;
                        }                        
                        return $query;
                    } )->first();                    
        }        
        return $result ? false : true;        
    }
}

第三步,去app\coonfig\app.config加上自訂的Provider,在providers區段加喔,我是把自訂都加在最下面,好找一點

'JoContract\Services\WDASValidation\ValidationServiceProvider',

最後就是改Request囉,這樣就大功告成。。。。。

    public function rules()
    {        
        switch (($this->has('OldDisplayName')?$this->input('OldDisplayName'):'')) {
            case '':                
              return [

                    'AccountNo'=>'required|UniqueManyKey:Account,CompanyID,'.WDASGetCompanyID().'其它欄位,’.'其它值',
                    'ChineseName'=>'required|max:100',
                    'DisplayName'=>'required|max:100',
                    'CompanyMail'=>'email',
                    'StartDate'=>'date_format:'.WDASdateformat(),
                    'StopDate'=>'date_format:'.WDASdateformat(),

                ];
            default:                
                return [                                          
                    'ChineseName'=>'required|max:100',
                    'DisplayName'=>'required|max:100',
                    'CompanyMail'=>'email',
                    'StartDate'=>'date_format:'.WDASdateformat(),
                    'StopDate'=>'date_format:'.WDASdateformat(),

                ];  
            
        }        
        
    }

 

打雜打久了,就變成打雜妹

程式寫久了,就變成老乞丐