When clicking the edit button in show.blade.php it should show edit.blade.php, but gives 'Invalid argument supplied for foreach()'

Everything else works... Any ideas what I'm doing wrong?

Whole error msg: ErrorException Invalid argument supplied for foreach() (View: Real-estate/resources/views/properties/edit.blade.php) (127.0.0.1:8000/properties/8/edit)

The foreach loop (in: vendor/laravelcollective/html/src/FormBuilder.php:656)

foreach ($list as $value => $display) {

     $optionAttributes = $optionsAttributes[$value] ?? [];

     $optgroupAttributes = $optgroupsAttributes[$value] ?? [];

     $html[] = $this->getSelectOption($display, $value, $selected, $optionAttributes, $optgroupAttributes);
}

Views

show.blade.php

<a href="/properties/{{ $property->id }}/edit" class="btn btn-light">Edit</a>

edit.blade.php

{!! Form::open(['action' => ['PropertiesController@update', $property->id], 'method' => 'POST', 'enctype' => 'multipart/form-data']) !!}  
        // a bunch of <div class="form-group"></div> go here
        {{ Form::hidden('_method', 'PUT') }}
        {{ Form::submit('Done', ['class' => 'btn btn-primary']) }}
 {!! Form::close() !!}

create.blade.php

{!! Form::open(['action' => 'PropertiesController@store', 'method' => 'POST', 'enctype' => 'multipart/form-data']) !!}
       // a bunch of <div class="form-group"></div> go here
       {{ Form::submit('Publish', ['class' => 'btn btn-primary']) }} 
{!! Form::close() !!}

Controller

public function store(Request $request)
{
    $property = new Property;
    $property->title = $request->input('title');
    .
    .
    .
    $property->save();
    return redirect('/home');
}

public function update(Request $request, $id)
{
    $property = Property::find($id);
    $property->title = $request->input('title');
    .
    .
    .
    $property->save();
    return redirect('/home');
}

dd($property) before $property->save(); in public function store() above

App\Property {#1204 ▼
  #table: "properties"
  +primaryKey: "id"
  #connection: null
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: array:10 [▼
    "title" => "Nice House"
    "reference_no" => "1234"
    "published_date" => "2021-06-04"
    "price" => "400k"
    "property_type" => "example"
    "area" => "example"
    "city" => "Example city"
    "description" => "example"
    "images" => "noimage.jpg"
    "user_id" => 2
  ]
  #original: []
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [▼
    0 => "*"
  ]
}
2

There are 2 best solutions below

0
DeltaG35 On BEST ANSWER

Ok so the problem is now solved. The error was caused by a wrongly configured form field: {{ Form::select }} in create.blade.php. I was missing null, so it should be: {{ Form::select('city', ['Example City 1' => 'Example City 1', 'Example City 2' => 'Example City 2' ], null, ['placeholder' => 'Select city...']) }}

9
Simon On

Can you check what the value of $list is?

EDIT:

$list returns a string.

foreach($array as $key=>$value) {
    // Do stuff
}

When using above shown example, $array is the array used by the foreach, $key is each array item's key name and $value is it's corresponding value.

In your case, this is:

foreach ($list as $value => $display) {
    ...
}

When you're trying to get the array's key ($value) and value ($display), it receives the invalid argument supplied for the foreach().