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

时间:2015-09-10 23:31:14

标签: php mysql laravel laravel-5 eloquent

我有3张桌子

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

问题是,我需要手动获取subreddit / category的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');

3 个答案:

答案 0 :(得分:1)

当您使用Route Model Binding时,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);
}

答案 1 :(得分:0)

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

show(Subreddit $subreddit)

我在某个地方看到了它,但我不记得是否需要使用它。

你在数据库中使用id列自动增量吗?如果没有,你必须在模型中指定它添加属性递增并将其设置为false

public $incrementing = false;

并指定实际的主键

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

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

答案 2 :(得分:0)

我认为你想要的是路线模型绑定

如果您正在使用laravel 5,那么jeff方式恰好有一个非常好的教程here

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

好消息是路径模型绑定也很灵活,甚至可以将模型中的复杂数据子集绑定到路径上。我认为这符合你的需要。