调用未定义的方法stdClass :: checkSubcategory()

时间:2017-04-02 06:12:04

标签: php laravel laravel-5

我试图创建一个动态菜单,在菜单部分我要显示一个类别,如果该类别有任何子类别,我想在它下面显示它..

我在类别模型上阅读了以下方法

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

错误可能是什么原因。请提出任何建议。

1 个答案:

答案 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();
}