Validate uniqueness in an Array with Laravels Validator

Did you know Laravels Validator class is well equiped to deal with Arrays?

Today I needed some form validation to make sure every item in an array was referencing its own distinct product.

Imagine a simple Livewire component to create an order that could look like this:

class OrderFormComponent extends Component
{
    public Collection $orderLines;

    public function addLine(int $productId, int $quantity): void
    {
        $this->orderLines->push([
            'product_id' => $productId,
            'quantity' => $quantity,
        ]);
    }
}

In this component a user can add orderlines to the order. However we want to make sure that the user does not accidentally add a product twice.

To do this we can use the array validation features Laravel provides:

public function save(): void
{
    $validatedData = Validator::make([
        'orderLines' => $this->orderLines->toArray(),
    ], [
        'orderLines.*.product_id' => 'distinct',
        'orderLines.*.quantity' => 'required|integer|min:1',
    ]);

    // Do something with the validated data.
}

As you can see we can use the * to say we need to validate every item in the orderLines array. We use the distinct rule on the product_id to make sure every product_id is only selected once.

You can read more about array validation in Laravel in the documentation: Validating Arrays.