我试图创建一个动态菜单,在菜单部分我要显示一个类别,如果该类别有任何子类别,我想在它下面显示它..
我在类别模型上阅读了以下方法
ordering
这是视图
public static function checkSubcategory($id){
$category = Category::find($id);
$id = $category->id;
$subcategories = \DB::table ('subcategories')
->join('categories_subcategories','subcategories.id','=','categories_subcategories.subcategory_id')
->join('categories','categories_subcategories.category_id','=','categories.id')
->where('categories.id','=',$id)
->select('subcategories.name')
->get();
return $subcategories;
}
但问题是,当我试图加载视图时,我看到以下错误
@foreach($categories as $row) @if($row->checkSubcategory($row->id)) <li class="dropdown"> <a href="#" class="dropdown-toggle"> {{$row->name}} </a> <ul class="dropdown-menu"> <li> @foreach($row->checkSubcategory($row->id) as $sub) <a href="{{asset('subcategories/product/'.$sub->name)}}">{{$sub->name}}</a> @endforeach </li> </ul> </li> @else <li class="pull-right"><a href="#">{{$row->name}}</a></li> @endif @endforeach
错误可能是什么原因。请提出任何建议。
答案 0 :(得分:1)
您使用的对象类型为stdClass,因此无法访问您在控制器模型中定义的函数。可能的原因是您使用DB
获取了类别。它为您提供了一个包含stdClass类型对象的数组。您需要的是Category
类型的对象。因此,您应该使用类别模型获取类别
//change
$categories = DB::table('categories')->get();
//to
$categories = Category::get();
此外,您将其定义为静态函数
public static function checkSubcategory($id)
表示您无法使用对象调用它
$row->checkSubcategory($row->id)
从函数定义中删除static
关键字。
此外,您可以重构您的功能。不是传递id,而是使用$this->id
获取id。
public function checkSubcategory(){
return \DB::table ('subcategories')
->join('categories_subcategories','subcategories.id','=','categories_subcategories.subcategory_id')
->join('categories','categories_subcategories.category_id','=','categories.id')
->where('categories.id','=', $this->id)
->select('subcategories.name')
->get();
}
您甚至可以深入了解并通过关系使您的代码更好。
public function subcategories() {
return $this->belongsToMany(SubCategory::class, 'categories_subcategories', 'category_id', 'subcategory_id');
//Why do you have a many to many relationships between categories and subcategories ?
}
您的checkSubcategory将成为
public function checkSucategory() {
return $this->subcategories()->count();
}