[ 'nullable', 'string', 'max:1000', ], 'items' => [ 'sometimes', 'array', ], 'items.*.id' => [ 'required', 'integer', 'distinct', Rule::exists('invoice_items', 'id')->where('invoice_id', $this->route('invoice')->id), ], 'items.*.quantity' => [ 'required', 'numeric', 'gt:0', ], ]; } /** * The message string IS the translation key here, as everywhere else in the * app: the front end maps it to a localized string. */ public function messages(): array { return [ 'items.*.id.required' => 'credit_item_not_on_invoice', 'items.*.id.integer' => 'credit_item_not_on_invoice', 'items.*.id.distinct' => 'credit_item_not_on_invoice', 'items.*.id.exists' => 'credit_item_not_on_invoice', 'items.*.quantity.required' => 'credit_quantity_invalid', 'items.*.quantity.numeric' => 'credit_quantity_invalid', 'items.*.quantity.gt' => 'credit_quantity_invalid', ]; } }