【问题标题】:Querying a pivot table through a relationship通过关系查询数据透视表
【发布时间】:2015-09-15 14:36:08
【问题描述】:

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

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

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

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

category_page 是一个数据透视表,它保存了category_idpage_id


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

所以,假设我有三页

1:梅苏特·厄齐尔
2:多特蒙德
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 更好?这里的最佳做法是什么?

【问题讨论】:

  • 试试Pages::with('posts') -> with('categories')....

标签: php laravel eloquent laravel-5.1


【解决方案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);
}

它将进行一个嵌套查询。

【讨论】:

  • 谢谢。已经在我的 Postclass 中建立了关系。我的 Eloquent 已经很流利了,但是当涉及到多个 talbes 时,我有点卡住了!
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多