在Laravel 5.6中获取“当前类别”详细信息

时间:2018-07-09 13:31:50

标签: laravel laravel-5.6

我正在尝试获取当前类别的详细信息。 例如,如果路线为example.com/articles/category-slug

在我的ArticleCategory模型中

public function article(){
      return $this->hasMany(Article::class);
  }

在文章模型中

public function category(){
         return $this->belongsTo(ArticleCategory::class, 'category_id');
    }

路线

Route::group(['prefix' => 'articles'], function(){
      Route::get('/', 'Frontend\ArticleController@index')->name('articles.index');
      Route::get('/{articlecategory}', 'Frontend\ArticleController@category');
      Route::get('/{articlecategory}/{slug}', 'Frontend\ArticleController@show');
    });

ArticleController

public function category(Request $request, ArticleCategory $articlecategory)
 {
   $category = $articlecategory->id;
   $currentcategory = ArticleCategory::where('id', $category)->first();
   return $currentcategory;
 }

我创建了两个类别:1.更新2.新闻

当我转到网址example.com/articles/updates时收到错误消息"Page Not Found"

仅在路由文件中更改{{ articlecategory }} to {{ category }}时。它显示空白页,没有当前类别的详细信息。该如何解决?

注意:我在Laravel 5.5中使用了相同的代码,并且运行良好。在Laravel 5.6中,我看到此错误。我已经在chrome上使用了缓存杀手,并且已经清除了laravel中的缓存和视图(如Google上的一些链接所建议)。但是我仍然看到相同的错误

3 个答案:

答案 0 :(得分:1)

我找到了一种可行的方法。

我已将路由键值更改为“ slug”,并且有效。我认为这是由我使用的slugs包完成的。在将以下代码手动添加到模型后,它可以按预期工作。

public function getRouteKeyName()
      {
          return 'slug';
      }

答案 1 :(得分:1)

如果您希望模型绑定在检索给定的模型类时使用id以外的数据库列,则可以覆盖Eloquent模型上的‍ getRouteKeyName方法:

例如:

class ArticleCategory extends Model
{
    public $table='article_category';

    public function article(){
        return $this->hasMany(Article::class);
    }

    public function getRouteKeyName()
    {
        return 'category_slug';
    }
}

和我的article_category表:

| category_slug |   name  | id |
|:-------------:|:-------:|:--:|
|      cat1     | Updates |  1 |
|      cat2     |   News  |  2 |

答案 2 :(得分:0)

您的路线应为:

Route::group(['prefix' => 'articles'], function(){
      Route::get('/', 'Frontend\ArticleController@index')->name('articles.index')->name('articles');
      Route::get('/{category}', 'Frontend\ArticleController@category')->name('category');
      Route::get('/{category}/{slug}', 'Frontend\ArticleController@show')->name('category_articals');
    });

现在您要向控制器传递category_slug

  

示例:example.com/articles/news

在您的控制器中:

public function category(Request $request,$category)
 {
   $category = ArticleCategory::where('slug',$category)->first();
   if($category){
      // category found , return category to page
      return view('category',compact('category'));
   }else{
      // category not found , return 404 page
      return view('error.404');
   }
 }