首页 > 解决方案 > 雄辩的子查询是否该行是最新的

问题描述

我有以下子查询:

->whereHas('statuses', function($query){
           $query->where('status_id', request('status'));
})->orderBy(...)->paginate();

为简单起见,我隐藏了完整的查询。假设我有数据透视表user_status。用户有很多状态,一个状态也可以有很多用户(不寻常,我知道。只是作为一个例子)。user_status因此,当我如上所述查询数据透视表时,我会得到那些具有请求状态 ID 的行。但我还想添加该行必须是该特定用户的最新行(而不是在整个表中)的约束。下面是 user_status 表的样子:

+---------+-----------+---------------------+
| user_id | status_id | created_at          |
+---------+-----------+---------------------+
|       1 |         1 | 2018-09-03 18:39:14 |
|       1 |         8 | 2018-09-03 18:51:42 |
+---------+-----------+---------------------+

在这种情况下,如果请求status的是1,我不希望返回此行,因为status_id1 不是 1 的最新行user_id(请参阅列中的时间差create_at)。

我怎样才能做到这一点?

标签: phplaraveleloquent

解决方案


您可以通过使用带有嵌套查询的另一个条件来实现这一点。

->whereHas('statuses', function($query){
       $query->where('status_id', request('status'))
             ->whereIn('user_status.id', function($query) {
                $query->selectRaw('MAX(id)')
                      ->from('user_status')
                      ->groupBy('user_id');
             });
})->orderBy(...)->paginate();

嵌套查询将只选择最新的行(假设 user_status.id 是auto-increment


推荐阅读