使用Eloquent定义与group by和最近日期

时间:2015-08-26 16:56:47

标签: php laravel laravel-4

使用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')。

1 个答案:

答案 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();
}