Laravel - Eloquent ORM关系查询

时间:2015-11-24 07:41:25

标签: php mysql laravel orm eloquent

我有5张桌子:

 1. news
 2. tags
 3. filters
 4. news_tag
 5. tag_filters

表格结构如下:

新闻

id
title
description

代码

id
title

过滤器

id
title

news_tag

id
tag_id
news_id

TAG_FILTER

id
tag_id
filter_id

比方说我的表有以下记录:

news: id = 1 title = News_1 Description = Details for News_1
tags: id = 1 title = PHP
filters: id = 1 title = PHP News
news_tag: id = 1 tag_id = 1 news_id = 1
tag_filter: id = 1 tag_id = 1 filter_id = 1

我的模型中的关系如下:

新闻模式

public function tags(){

    return $this->belongsToMany('App\Tag', 'news_tag');
}

标记模型

public function news(){

    return $this->belongsToMany('App\News', 'news_tag');
} 

public function filters(){

    return $this->belongsToMany('App\Filter', 'tag_filter');
}

过滤模型

public function tags(){

    return $this->belongsToMany('App\Tag', 'tag_filter');
}

假设我的路线如下:Route::get('news/filter/{filter_id}','NewsController@getNews');

当我将 filter_id 1 传递给我的路线时,我想要检索与 tag_id 1 相关的所有新闻。任何人都可以帮助我在我的控制器中执行此操作吗?

2 个答案:

答案 0 :(得分:0)

没有简单的方法可以做到这一点,但你可以使用这样的东西:

News::select("news.*")
  ->join('tags'...)
  ->join('filters'...)
  ->where('filter_id',...)
  ->where('tag_id',...)
  ->get();

注意select()指令。如果您跳过它,Laravel会将无效字段加载到您的News模型中。当您加入Eloquent Builder时,这是必须的。

如果您想在这种情况下急切加载关系,请使用查询构建器的with()方法。

答案 1 :(得分:0)

你可以尝试一些嵌套的whereHas而不是join。我不确定表现。

    $filterId = 1;
    News::whereHas('tags', function($q1) use ($filterId) {
        $q1->whereHas('filters', function($q2) use ($filterId) {
            $q2->where('id', '=', $filterId);
        });
    });