Laravel eloquent结合max()和where()或有()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel eloquent结合max()和where()或有()相关的知识,希望对你有一定的参考价值。

我正在寻找一个雄辩的声明,它会给出每个room_id的最大值(时间戳),因为该room_id的所有时间戳值都超过了15天。 (基本上任何在过去15天内没有清理的房间......)

maintenancelog

+----+-------------------+---------+---------------------+
| id | maintenance_value | room_id |      timestamp      |
+----+-------------------+---------+---------------------+
|  1 | Cleaned           |       1 | 2015-09-06 00:54:59 |
|  2 | Cleaned           |       1 | 2015-09-07 01:55:59 |
|  3 | Cleaned           |       2 | 2015-09-06 02:56:59 |
|  4 | Cleaned           |       2 | 2015-09-16 03:57:59 |
|  5 | Cleaned           |       3 | 2015-09-06 04:58:59 |
|  6 | Cleaned           |       3 | 2015-09-07 05:59:59 |
+----+-------------------+---------+---------------------+

我很讨厌mysql,但这相当于一个Oracle声明...

select room_id,max(timestamp) from maintenancelog
group by room_id
having max(timestamp) < sysdate - 15;

雄辩的陈述应该基本上返回以下内容。

1, 2015-09-07 01:55:59
3, 2015-09-07 05:59:59 

我试过了...

$dt = Carbon::now();
$checkdate = $dt->subDays(15);
return $this->groupBy('room_id')->max('timestamp')->having('timestamp','<',$checkdate);

但得到

Call to a member function having() on string

试...

return $this->groupBy('room_id')->havingRaw("max(timestamp)<sysdate()-15");

只返回时间戳超过15的任何行,忽略其他最大值...

答案

像count()这样的max()是eloquent中的最终函数,代替get()。你真正想要的是select中的max()作为原始语句。

return $this->select(DB::raw('room_id, max(`timestamp`) as `timestamp`'))
    ->groupBy('room_id')
    ->having('timestamp','<',$checkdate)
    ->get();

以上是关于Laravel eloquent结合max()和where()或有()的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 选择所有具有 max created_at 的行

如何使用 eloquent 在 laravel 中编写多个连接

将 MariaDB 语句转换为 Laravel4 Eloquent-Query

Laravel Eloquent 按孩子的长度排序,然后分页

用 Laravel/Eloquent 为 Yajra DataTables 编写连接查询的慢 MySQL

Laravel教程 四:数据库和Eloquent