简体   繁体   中英

Undefined variable: categories in Blade Laravel 6.4.0

I am trying to show my categories on the site map page with the controller below.

CategoryController.php

class CategoriesController extends Controller
{
    public function create()
    {
        $categories = Category
                  ::orderBy('name','desc')
                  ->where('parent_id', NULL)
                  ->get();

        return view('admin.category.create', compact('categories'));
    }
}

The following is the part of my Blade file where I use the categories variable template.

create.blade.php

<div class="form-group">
    <label for="exampleInputPassword1">Parent Category</label>
    <select name="parent_id" class="form-control">
        @foreach ($main_categories as $category)
            <option value="{{ $category->id }}">{{ $category->name }}</option>
        @endforeach
    </select>
</div>

I use every way to get variable and passing but none the didn't work do you have any suggestion?

You've got two options here.

Option A:

You named the collection categories in your Controller and pass it to the view as such. To access it in your view, you need to reference it by the same name.

Change this:

// Your view is looking for a collection titled `main_categories`, which does not exist
@foreach ($main_categories as $category)
  <option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach

To this:

@foreach ($categories as $c)
  <option value="{{ $c->id }}">{{ $c->name }}</option>
@endforeach

Option B:

Pass the data back using main_categories as the collection name

Change this:

return view('admin.category.create', compact('categories'));

To this:

return view('admin.category.create', [
    'main_categories' => $categories
]);

You can read up more on passing data to views here.

To be more clear Ill break your code as below and add some details

    class CategoriesController extends Controller
{
    public function create()
    {
        $categories = Category
                  ::orderBy('name','desc')
                  ->where('parent_id', NULL)
                  ->get();
// Your are passing variable but I change it as below to be more clear

     //   return view('admin.category.create', compact('categories'));
//now you are passing the value to the view
          return view('admin.category.create', ['categories' => $categories]);
    }
}

Now lets catch it in the view. Note that now $categories available in the view. If you pass ['A' => $categories] then view has $A variable so you should call for the relevant variable that you define in the controller.

   <div class="form-group">
        <label for="exampleInputPassword1">Parent Category</label>
        <select name="parent_id" class="form-control">
**{{-- In here you should pass $categories --}}**
            @foreach ($categories as $category)
                <option value="{{ $category->id }}">{{ $category->name }}</option>
            @endforeach
        </select>
    </div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM