我有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 相关的所有新闻。任何人都可以帮助我在我的控制器中执行此操作吗?
答案 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);
});
});