Andre
Andre

Reputation: 638

(laravel) how to use unique validation request on update

I want to use unique validation in Lavavel 8 but the problem is that it doesn't allow me to update when I don't change the name field

my update code on my TemplateController

    public function updateTemplate($templateId, TemplateRequest $templateRequest)
    {
        $thumbnailUrl = $this->templateService->updateThumbnail($templateRequest);

        $this->templateRepository->updateTemplateInfo($templateRequest, $templateId, $thumbnailUrl);
        
        return redirect()->route('templates.list.show', [$templateId])
            ->with(["message" => __('templates.edit.success')]);
}

this is my UpdateTemplateInfo at TemplateRepository

public function updateTemplateInfo($request, $templateId, $thumbnail)
{
    $template = $this->getTemplate($templateId);
    $template->name = $request->name;
    $template->thumbnail = $thumbnail;
    $template->business_type_id = $request->business_type;
    $template->update();
}

and this is my TemplateRequest

public function rules()
{
    return [
        'name' => 'required|unique:templates',
        'business_type' => 'required'
    ];
}

this is the method in web.php

Route::patch('/list/{templateId}/update', 'TemplateController@updateTemplate')->name('templates.list.update');

When I try to update without change the name field, the validator fails

Upvotes: 0

Views: 57

Answers (2)

Rob
Rob

Reputation: 12872

If you don't want to create a separate request for post and put you can do something like this...

public function rules() {
    $rules = [
        'name' => 'required|unique:templates,name',
        'business_type' => 'required'
    ];

    if ($this->method() === 'PUT') {
        $rules['name'] .= ',' . $this->route('templateId');
    }

    return $rules;
}

Upvotes: 1

Amjad
Amjad

Reputation: 374

you should create a new request class for the update case

public function rules()
{
    return [
        'name' => "required|unique:templates,name,{$this->name}",
        'business_type' => 'required'
    ];
}

or you can edit the current request class to this:

public function rules()
{
    $rules = [
        'business_type' => 'required'
    ];

    if (request()->method == 'PUT') {
        $rules['name'] = "required|unique:templates,name,{$this->name}";
    } else {
        $rules['name'] = 'required|unique:templates';
    }

    return $rules;
}

Upvotes: 0

Related Questions