带有连接和参数的雄辩查询


Laravel Eloquent query with joins and parameters

我有一个项目(论文)列表,并希望显示具有特定区域的所有论文。现在我希望用户能够根据不同的属性来筛选论文列表。

这些是表/模型

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年的论文,但是我遇到了两个问题

  1. 如何用url中的参数替换年份?

  2. 如何以一种方式过滤结果集,我有一个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方法。您应该能够对所有其他过滤需求做基本相同的事情。