Mr.Singh
Mr.Singh

Reputation: 1781

Laravel validate if same item is selected more than once

In my application I have add more functionality for selected multiple devices. I need to show an error message if the user has selected the same device two or more times.

Here is my code.

class ValidateDeviceRequest extends FormRequest
{
    private $data = [];

    public function __construct()
    {
        $this->data = request()->all();
    }

    public function rules()
    {
        $rules = [
            'devices' => ['required', 'array'],
            'devices.*.device_company_id' => [
                'required', 
                'integer', 
                'exists:device_companies,id,company_id,' . session()->get('COMPANY_ID')
            ],
        ];

        foreach($this->data['devices'] as $key => $array)
        {
            $rules["devices.{$key}.device_id"] = [
                'required',
                'integer',
                "exists:devices,id,device_company_id," . @$array["device_company_id"]
            ];
        }

        # returning
        return $rules;
    }
}

Upvotes: 0

Views: 1084

Answers (2)

Mr.Singh
Mr.Singh

Reputation: 1781

Thanks to @Tommie. Here is my final code.

class ValidateDeviceRequest extends FormRequest
{
    private $data = [];

    public function __construct()
    {
        $this->data = request()->all();
    }

    public function rules()
    {
        $rules = [
            'devices' => ['required', 'array'],
            'devices.*.device_company_id' => [
                'required', 
                'integer', 
                'exists:device_companies,id,company_id,' . session()->get('COMPANY_ID')
            ],
            'devices.*.device_company_id' => [
                'required',
                'distinct',
            ]
        ];

        foreach($this->data['devices'] as $key => $array)
        {
            $rules["devices.{$key}.device_id"] = [
                'required',
                'distinct',
                'integer',
                "exists:devices,id,device_company_id," . @$array["device_company_id"]
            ];
        }

        # returning
        return $rules;
    }
}

I also found this Laravel array validation for unique attribute in array but not required to be unique in table

Upvotes: 1

Tommie
Tommie

Reputation: 88

If you're just checking duplicated values inside the array. You can use the validation rule distinct for this.

'devices.*.device_company_id' => [
    'distinct',
    // ...
]

If you wish to validate duplicates within a model you can use the rule unique:model

Upvotes: 2

Related Questions