@SteveBelanger
This is my complete soluction:
create the custom Validation Class and do everything you need to do!
<?php
namespace App\Vilidations;
use Illuminate\Support\Facades\DB;
class UniqueByTenantValidator extends \Illuminate\Validation\Validator
{
function validateUniqueByTenant( $attribute, $value, $parameters, $validator )
{
return UniqueByTenantValidator::uniqueByTenant( $attribute, $value, $parameters ) ;
}
static function uniqueByTenant( $attribute, $value, $parameters ) {
$table = $parameters[0];
$field = $parameters[1];
$tenant_id = $parameters[2];
$excluded_id = $parameters[3];
// query the table with all the conditions
$result = DB::table( $table )->select( \DB::raw( 1 ) )
->where($field , $value)
->where(function($query) use( $tenant_id ){
$query->where( 'tenant_id' , $tenant_id )
->orWhereNull('tenant_id');
});
if( $excluded_id != 'NULL' )
{
$result->where( 'id' , '!=', $excluded_id );
}
$result = $result->get();
return empty( $result ); // edited here
}
}
Now you can call in your model like this
....
class County extends Model
{
protected $fillable = ['name' , 'references'];
public static function boot(){
parent::boot();
static::saving( function($county){
$attribuites = [
$county->getTable() ,
'name' ,
$county->tenant_id ,
$county->id == null ? 'NULL' : $county->id
];
if( ! UniqueByTenantValidator::uniqueByTenant( 'name' , $county->name, $attribuites ) ){
throw new UniqueByTenantException( trans('unique_by_tenant' , ['attribuite' => 'name']) , 1);
}
});
}
}
Or in you Request Validator
public function rules()
{
$user = Auth::user();
switch($this->method())
{
case 'GET':
case 'DELETE':
{
return [];
}
case 'POST':
{
return [
'county.name' => 'required|unique_by_tenant:counties,name,'.$user->getCurrentTenantId().',NULL'
];
}
case 'PUT':
case 'PATCH':
{
return [
'county.name' => 'required|unique_by_tenant:counties,name,'.$user->getCurrentTenantId().','.Request::route('id')
];
}
default:break;
}
}
Don't forget to register it on ServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
use App\Vilidations\UniqueByTenantValidator;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// ...
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new UniqueByTenantValidator($translator, $data, $rules, $messages);
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}