Warm tip: This article is reproduced from serverfault.com, please click

Laravel unique validation if ID isn't in request

发布于 2020-12-11 06:55:08

I want to do some validation for a field. Right now works for unique values, the problem is that on Update I get the same error. So I want to filter the request, if that post request contain ID field then this field shouldn't be unique.

public function rules()
{
    return [
        'customer_id' => 'required|unique:customers',
    ];
}
Questioner
Beusebiu
Viewed
0
Donkarnash 2020-12-11 15:28:21

You can use Rule class' unique method for the update method


public function rules()
{
    return [
        'customer_id' => [
            'required',
            Rule::unique('customers')->ignore($customer->customer_id),
    ];
}

Laravel docs: https://laravel.com/docs/8.x/validation#rule-unique

For common rules() function it can be done as

use Illuminate\Validation\Rule;

class CustomerController extends Controller
{

    protected function rules($customer)
    {
        return [
            'customer_id' => [
                'required',
                Rule::unique('customers')->ignore($customer->exists ? $customer->customer_id : null),
        ];
    }

    public function store(Request $request)
    {
        $customer = new Customer;
        $request->validate($this->rules($customer));
    }

    public function update(Request $request, Customer $customer)
    {
        $request->validate($this->rules($customer);
    }
}

In my case I have a single method for store/update and I check If I have an ID or not. Also I added $customer = request()->all(); and ignore($customer['ID'] , that is for my specific case.

Laravel Docs warns against passing user controller request input to the ignore method

enter image description here

For your specific case you can do

$customer = !empty($request->input('ID') ? Customer::findOrFail($request->input('ID')) : new Customer;

//Then pass the customer to the rules()
$validated = $request->validate($this->rules($customer));