通过关系

时间:2015-09-15 14:36:09

标签: php laravel eloquent laravel-5.1

我正在使用Laravel 5.1并拥有这四个数据库表

posts包含来自Facebook的帖子。 posts表有一个外键page_id。这是

的参考

pages表,其中包含所有Facebook页面。

category表包含项目中类别的数据,例如funnyvideos

category_page是一个数据透视表,用于保存category_idpage_id

我现在想要做的是获取所有帖子,这些帖子已由特定类别的页面发布。

所以,我们假设我有三页

1:Mesut Oezil
2:Borussia Dortmund
3:宝马

前两页属于sports类别,最后一页属于cars。现在,我想获取sport类别中的每个帖子发布的帖子。

我已经定义了关系

班级页面:

public function categories()
{
    return $this->belongsToMany(Category::class);
}

班级类别:

public function pages()
{
    return $this->belongsToMany(Page::class);
}

现在,我正在发帖子

$topPosts = (new Post)->where('fb_created_time', '>', Carbon::today()->toDateTimeString())
    ->visible()
    ->orderBy('total_count', 'desc');

现在我想要额外过滤特定类别页面中的帖子。我设法通过此代码获取特定类别的页面

$pages = Page::with('categories')
    ->whereHas('categories', function ($query){
        return $query->where('category_id', 1);
    })->get();

但我如何将其链接到帖子中?或者使用whereHas是否合适?这里最好的做法是什么?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望通过网页获取帖子,属于特定类别的内容。

在这种情况下,您的设置很好,您可以通过关系进行查询:

$category_id = 2;
Post::whereHas('page.categories', function($q) use($category_id) {
    $q->where('categories.id', $category_id);
})->get();

在你的Post课程中:

public function page()
{
    return $this->belongsTo(Page::class);
}

它将进行一次嵌套查询。