wiwa1978
wiwa1978

Reputation: 2687

Laravel validation with create form: retrieve old input data for dropdown box

I have a Laravel application which uses a form to create items. The form uses validation as defined in the Laravel documentation under this section.

I have a StoreItem Request file:

public function rules() {
  return [
      'item_name'=>'required',
      'category_id'=> 'required',
      'collection_id'=> 'required',
      'brewery_id'=> 'required',
  ];
}

and in the controller I have the following:

public function store(storeItem $request)
    {
      $validated = $request->validated();
      $item = new Item([
          'user_id'               =>      Auth::id(),
          'item_name'             =>      $request->item_name,
          'category_id'           =>      $request->category_id,
          'collection_id'         =>      $request->collection_id,
          'brewery_id'            =>      $request->brewery_id,
      ]);
      $item->save();

When validation is catching an error, the create form is presented again but I don't see the old input data.

For the input text fields, I have done the following:

<input type="text" class="form-control" name="item_name" value="{{ old('item_name') }}" />

and this shows the old input data, but what to do for the dropdown boxes like category_id, collection_id and brewery_id. I want them to have the old value as the 'selected' value.

Currently in the form I have (for the dropdown boxes):

 <div class="form-group">
    <label class="form-label" for="brewery">Brewery: (*)</label>
    <select class="form-control" name="brewery_id" >
       @foreach($breweries as $brewery)
           <option value="{{ $brewery->id }}">{{ $brewery->brewery_name }}</option>
       @endforeach
    </select>
 </div>

This source seems to indicate that using the old() method might even not be needed, but if I don't use the

Upvotes: 1

Views: 97

Answers (2)

Julius Fasema
Julius Fasema

Reputation: 902

try this as well. I've added bracket open and close to (old('brewery_id')==$brewery->id)

<div class="form-group">
    <label class="form-label" for="brewery">Brewery: (*)</label>
    <select class="form-control" name="brewery_id" >
       @foreach($breweries as $brewery)
           <option value="{{ $brewery->id }}" {{ (old('brewery_id') == $brewery->id)? "selected" : "" }}>{{ $brewery->brewery_name }}</option>
       @endforeach
    </select>
 </div>

Upvotes: 1

Nina Lisitsinskaya
Nina Lisitsinskaya

Reputation: 1818

You need to manually add the selected attribute to the previously selected value. For example:

 <div class="form-group">
    <label class="form-label" for="brewery">Brewery: (*)</label>
    <select class="form-control" name="brewery_id" >
       @foreach($breweries as $brewery)
           <option value="{{ $brewery->id }}" {{ old("brewery_id") == $brewery->id ? "selected" : "" }}>{{ $brewery->brewery_name }}</option>
       @endforeach
    </select>
 </div>

Upvotes: 2

Related Questions