2014-09-22 4 views
1

Я хотел бы сделать запрос по агрегированному значению из отношений модели. В качестве примера я должен получить только Сообщений, у которого есть последний комментарий между двумя датами.Яркий запрос по агрегированному отношению

SELECT posts.*, MAX(comments.created_at) 
as max FROM posts 
JOIN comments ON (comments.post_id = posts.id) 
GROUP BY posts.id HAVING max > '2014-01-01 00:00:00' AND max < '2014-02-01 00:00:00' 

ответ

2

Вместо объединения, используются встроенные методы:

// Assuming you have relations setup 
Post::whereHas('comments', function ($q) use ($from, $till) { 
    $q->groupBy('post_id') 
    ->havingRaw("max(created_at) between '{$from}' and '{$till}'"); 
})->get(); 

Он будет производить:

select * from `posts` where 
    (select count(*) from `comments` where `comments`.`post_id` = `posts`.`id` 
    group by `post_id` 
    having max(created_at) between '2014-01-01' and '2014-02-01' 
) >= 1 limit 1 
Смежные вопросы