I am creating a new record for a table named services including some fields (name, department_id, description) in database. I need unique combination of pair two fields together (name and department_id). How can I validate it for creating and updating functions?
In ServiceRequest:
return [
'params.name' => 'required|unique:services,name and depatment_id',
];
In Service Model:
public function department()
{
return $this->belongsTo(Department::class);
}
In DepartmentModel:
public function services()
{
return $this->hasMany(Service::class);
}
In Route:
Route::apiResource('/services', ServiceController::class)->names([
'store' => 'services_store',
'update' => 'services_update',
]);
Forexample:
when there is a service in a specific department, it gives error!
if there is a record of name = service1 and department_id = 1, user cannot create same record combination of name and department_id again! user allow to create service with (name = service1 and department_id = another_number) or (department_id = 1 and name = another_name) but creating a new record with (name = service1 and department_id = 1) is not allowed
CodePudding user response:
You can use the unique rule this way:
return [
'params.name' => [
'required',
Rule::unique('services', 'name')
->ignore($this->service)
->where('department_id', $this->input('params.department_id'))
],
];
Here you are telling Laravel to check if there is no existing record in the services table that have $this->input('params.name') as name and $this->input('params.department_id') as department_id.
The ->ignore($this->service) is here to make sure we ignore the current service (if we are updating), so it doesn't "find itself" during the validation.
$this->service will be the current instance you are updating (if you setup the routes and controllers correctly, which is another topic).
