使用Laravel 4-我正在努力使用Eloquent的关系模型在我的视图中返回查询而不是运行静态数据库查询。我确信我可以通过join方法使用group,但我知道 gotta 是模型中的一种方式来定义它。
简而言之,我的log_contents表有多个视图,可在用户查看文章时进行记录。
示例数据:
| id | content_id | action | created_at |
-------------------------------------------
| 1 | 2 | View | 10:30:00 |
| 2 | 2 | View | 10:31:00 |
| 3 | 5 | View | 08:32:00 |
| 4 | 2 | View | 13:59:00 |
| 5 | 3 | Like | 12:14:00 |
这是我到目前为止的功能,它显然返回了每个组的content_id的第一个实例:
public function articlesViewed()
{
return $this->hasMany('LogContent')
->where('content_type', '=', 'Article')
->whereAction('View')
->groupBy('content_id')
->orderBy('created_at', 'DESC');
}
但问题是我希望它返回最近的记录,因此在content_id = 2的情况下,它将返回行ID 4,但是现在它返回行ID 1。
我可以用雄辩的关系模型来做到这一点吗?或者我必须使用静态查询LogContent :: et('cetera')。
答案 0 :(得分:1)
这是一个典型的mysql查询问题,你想先命令然后groupBy结果。雄辩,实现这一点更容易。您应该使用查询范围。在LogContent
模型中,您应该遵循:
public function scopeMostRecent($query)
{
return $query->join(DB::raw('(SELECT id FROM table_name ORDER BY created_at DESC) as b'), function($join) {
$join->on('table_name.id', '=', 'b.id');
})->groupBy('content_id');
}
在你的文章Viewed()方法中:
public function articlesViewed()
{
return $this->hasMany('LogContent')
->mostRecent()
->where(''content_type', '=', 'Article')
->whereAction('View')
->get();
}