1

I sent an array from my form by javascript which gets values from different input fields and then storing it in a single variable.

<input type="hidden" name="details" id="details">

js

document.querySelectorAll('form')[1].addEventListener('submit', function(event) {
    var details = [];
    for (var i = 0; i < {{ $event->grocery->items()->count() }}; i++) {
        details[i] = [
            document.querySelectorAll('.store')[i].value,
            document.querySelectorAll('.item')[i].value,
            document.querySelectorAll('.quantity')[i].value,
            document.querySelectorAll('.brand')[i].value,
            document.querySelectorAll('.size')[i].value,
        ];
    }

    document.querySelector('#details').value = JSON.stringify(details);
});

Then in my controller, I decode the array using json_decode

$request->details = json_decode($request->details);

Now, I want to validate each iteration (just to check whether it is empty or not). So, I do like this,

$request->validate([
    ...
    'details.*.*' => 'required'
]);

But my problem is that this is not doing anything. Even if I sent an empty iteration it continues without returning an error.

Am I doing anything wrong here? Please help me.

Update

Example var dumping details

array:3 [▼
  0 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
  1 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
  2 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
]
Conor
  • 2,473
  • 1
  • 14
  • 22

1 Answers1

1

It would make it easier if you named your array values

document.querySelectorAll('form')[1].addEventListener('submit', function(event) {
    var details = [];
    for (var i = 0; i < {{ $event->grocery->items()->count() }}; i++) {
        details[i] = {
            store: document.querySelectorAll('.store')[i].value,
            item: document.querySelectorAll('.item')[i].value,
            quantity: document.querySelectorAll('.quantity')[i].value,
            brand:document.querySelectorAll('.brand')[i].value,
            size: document.querySelectorAll('.size')[i].value,
        };
    }

    document.querySelector('#details').value = JSON.stringify(details);
});

The validation would look like this:

$request->validate([
    ...
    'details.*.store' => 'required',
    'details.*.item' => 'required',
    'details.*.quantity' => 'required',
    'details.*.brand' => 'required',
    'details.*.size' => 'required'
]);

But if it doesn't suit you there is always Laravel's Custom Validation Rules

EDIT:

I think maybe the issue is with the update of your data:

$request->details = json_decode($request->details);

Instead you should modify your input befor validation and Modify input before form request validation

$request->request->set('details', json_decode($request->details));
Ramy Herrira
  • 574
  • 10
  • 13