我有一个项目(论文)列表,并希望显示具有特定区域的所有论文。现在我希望用户能够根据不同的属性来筛选论文列表。
这些是表/模型
Papers
id
name
author_id
year
paperQuality
userRating
Authors
id
name
birthDate
Paper_areas
id
paper_id
area_id
significance
Area
id
name
creationYear
我试着保持雄辩的相关。用户应该能够在纸张之后进行过滤。年,论文。paperQuality,论文。评级,paper_areas_significance, area.creationYear
这是我现在拥有的
$paper_areas_query = Paper_areas::join('areas', function($join){
$join->on('areas.id', '=', 'paper_areas.area_id')
->where('areas.creationYear', '=', 2011);
});
$paper_areas_query->join('papers', function($join){
$join->on('papers.id', '=', 'paper_areas.paper_id')
->where('papers.year', '=', 2011)
->where('papers.paperQuality', '=', 4)
->where('papers.userRating', '=', 5);
});
$paper_areas_query->join('authors', function($join){
$join->on('authors.id', '=', 'papers.author_id');
});
$paper_areas_query->select('paper_areas.id', 'paper_areas.paper_id', 'paper_areas.area_id');
$paper_areas_query->orderBy('authors.name','asc');
$paper_areas_query->orderBy('papers.title','asc');
$paper_areas_query->groupBy('papers.id');
现在只显示2011年的论文,但是我遇到了两个问题
如何用url中的参数替换年份?
如何以一种方式过滤结果集,我有一个Paper_areas的集合?查看上面的代码,它似乎不像其他代码那样"好"。
我会亲自修改您获取数据的方式,而是在模型本身中创建辅助函数。
在您的论文模型中,考虑如下内容:
public function fromYear($year)
{
return $this->where('year', '=', $year);
}
public function author()
{
return $this->belongsTo('Author');
}
在你的Areas
模型中:
public function papers()
{
return $this->belongsToMany('Paper', 'Paper_areas', 'id', 'topic_id');
}
然后,对于给定的Area
实例,您可以获得给定年份该区域所有论文的所有作者:
$id = 1;
$area = Area::find($id);
$papers = $area->papers->fromYear(2011)->get();
foreach($papers as $paper) {
$author = $paper->author;
// ...
}
至于从URL参数中获取年份,你可以在你的路由中这样做:
Route::get('/my-route/{year}', 'MyController@action');
在你的控制器中像这样:
class MyController
{
public function action($year)
{
$area = /** get area instance **/;
$papers = $area->papers->fromYear($year)->get();
}
}
之后,点击路由/my-route/2014
将把字符串2014传递给上面的action
方法。您应该能够对所有其他过滤需求做基本相同的事情。