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(),
];
}
}
打雜打久了,就變成打雜妹
程式寫久了,就變成老乞丐