2015-09-24 4 views
0

Я ищу красноречивый оператор, который даст мне максимальную отметку времени (timeestamp) для каждого room_id, учитывая, что все значения временной метки старше 15 дней для этого room_id. (По существу, любой номер, который не был очищен в течение последних 15 дней ...)Laravel eloquent comb max() и где() или having()

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, игнорируя другие максимальные значения ...

ответ

1

max() как count() является конечной функцией в красноречиве вместо get(). То, что вы действительно хотите, это max() в select как исходный оператор.

return $this->select(DB::raw('room_id, max(`timestamp`) as `timestamp`')) 
    ->groupBy('room_id') 
    ->having('timestamp','<',$checkdate) 
    ->get(); 
Смежные вопросы