Laravel 5:如何检索和显示属于某个类别的所有帖子


Laravel 5: how can I retrieve and display all posts that belong to certain category

我有3张表

user:       id, username
subreddits: id, name, created_at
posts:      id, title, link, user_id, subreddit_id

问题是,我正在手动抓取subreddit/类别的id,而我需要动态抓取它。我怎样才能做到呢?

这是SubredditController.php

中的show()方法
public function show(Subreddit $subreddit)
    {
        $posts = Subreddit::findOrFail(3)->posts()->get();
        return view('subreddit/show')->with('subreddit', $subreddit)
                                    ->with('posts', $posts);
    }

这是Subreddit Model

class Subreddit extends Model
{
    protected $fillable = [
        'name',
        'description'
    ];
    public function user() {
        return $this->belongsTo('App'User');
    }
    public function posts() {
        return $this->hasMany('App'Post');
    }
}

routes.php

Route::resource('subreddit', 'SubredditController');
Route::resource('posts', 'PostsController');

RouteServiceProvider.php

$router->model('articles', 'App'Article');
$router->model('subreddit', 'App'Subreddit');
$router->model('posts', 'App'Post');

当你使用路由模型绑定时,Laravel将自动检索URI中提供的$id对象,然后可以使用依赖注入将其作为参数注入到你的方法中。

public function show(Subreddit $subreddit){ ... }

你可以像访问任何对象一样访问数据。例:要访问记录的id,可以使用$subreddit->id

public function show(Subreddit $subreddit)
{
    $posts = Subreddit::findOrFail($subreddit->id)->posts()->get();
    return view('subreddit/show')->with('subreddit', $subreddit)
                                    ->with('posts', $posts);
}

我是Laravel的新手,但我认为你需要定义一个带参数的路由(抱歉,如果我误解了你的问题)。

http://laravel.com/docs/5.1/routing路由参数

你需要通过你的路由传递id。

在你的routes.php文件中,你可以这样写:
Route::get('subreddit/{id}', 'SubredditController@show');

在SubredditController.php中,将id传递给方法,像这样:

public function show($id)
{
    $subreddit = Subreddit::findOrFail($id);
    $posts = $subreddit->posts()->get();
    return view('subreddit/show')->with('subreddit', $subreddit)
                                 ->with('posts', $posts);
}

为什么要将模型键入函数的参数?

show(Subreddit $subreddit)

我在什么地方见过它,但我不记得有必要使用它。

您是否在数据库中使用id列自动增量?,如果没有,则必须在模型中添加属性increment并将其设置为false

public $incrementing = false;

并指定实际的primarykey

protected $primaryKey = 'code';

使用你发布的配置,这段代码为我工作:

routes.php

Route::resource('subreddit', 'SubredditController');

SubredditController.php

public function show($id)
{
    $subreddit = Subreddit::findOrFail($id);
    $subreddit->load('posts');
    return view("subreddit/show")->with("subreddit", $subreddit);
}

http://localhost:8888/test/public/subreddit/1

我在同一个对象中加载关系所以只向视图发送一个参数

我想你这里想要的是路由模型绑定

如果你正在使用laravel 5, jeff way恰好有一个非常好的教程

也是路由模型绑定的文档。

好消息是路由模型绑定也很灵活,甚至可以将复杂的数据子集从你的模型绑定到路由。我想这正合你的需要。

获取所有帖子的分类

$categories = Subreddit::with('posts') -> where('id',$id) -> first(); 
if (categories){
  $data['results'] = categories;
}else{
  $data['results'] = null;
}
return view('myview') -> with($data);

在视图中可以访问变量$results。在你的视图

if (!is_null($results){
  foreach($results as $result){
    // do something.
  }
}