无法通过slug获取项目而不是laravel中的id

时间:2017-10-17 09:38:09

标签: php laravel laravel-5

我试图让我的网址有点用户友好,但我无法使用。

我已添加到RouteServiceProvider这个

Route::bind('items_route', function ($value) {         
   return \App\Item::where('alias', $value)->firstOrFail();  
});

这是我的route.php

Route::get('item/{item}', 'ItemController@show')->name('item.show');

我视图中的按钮

{!! HTML::linkRoute('item.show', 'View', array($item->alias)) !!}

和控制器

public function show( Item $items_route )
{
    $reviews = Review::where('item_id', $items_route->id)->where('approved', 1)->get();
    $item = Item::with('taggs')->find($items_route->id);
        $additionAds = Item::with('taggs')->where('id', '!=', $items_route->id)->get();
    if($item) {
        $item->views = (int) $item->views +1;
        $item->save();
    }

    $category = Category::find($item->category_id);
    if($category->parent_id == 0) {

         $ids = Category::select('id')->where('parent_id', $item->category_id)->where('parent_id','!=',0)->get();
         $array = array();

         foreach ($ids as $id) {
            $array[] = (int) $id->id;
         }
         $items = Item::select('*')->whereIn('category_id',$array)->whereNotIn('id', [$item->id])->get();

    } else {
        $items =  Item::select('*')->where('category_id' ,$item->category_id)->whereNotIn('id', [$item->id])->get();
    } 

    $item_images = Item_Images::where('item_id',$items_route->id)->get();

    $defaultCountry = DB::table('items')
                ->leftJoin('countries', 'items.country_id', '=', 'countries.id')
                ->where('items.id', $items_route->id)
                ->select('items.*', 'countries.*')
                ->first();
    return view('item', compact('item','items','item_images','defaultCountry', 'additionAds', 'reviews'));
}

错误是

  

ItemController.php第40行中的ErrorException:   试图获得非对象的属性

第40行是查询类别$category = Category::find($item->category_id);的地方。出现错误是因为$item为空。

谁能告诉我们这里发生了什么?为什么我无法从控制器获取项目和所有属性?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为数据库中没有ID = $items_route->id项,因此此代码将返回null

Item::with('taggs')->find($items_route->id);

所以,你需要检查结果:

if (is_null($item)) {
    // Do some stuff.
} else {
    // Item is not found.
}