Laravel - 以一对多的关系获得状态的最后记录

时间:2018-01-17 12:14:11

标签: php sql laravel eloquent relationship

我正在使用Laravel 5.5版,我有一对多的关系。 在第一张表(乘客)中,我有乘客登记册

Passengers
id|name
1|Carlos
2|Pedro

在第二张表格中,我列出了这些乘客的出入境历史

id|passenger_id|type|created_at
1|1|in|2018-01-16 00:00:00
2|2|in|2018-01-16 01:00:00
3|3|in|2018-01-16 02:00:00
4|1|out|2018-01-16 03:00:00
5|1|in|2018-01-16 04:00:00
6|2|out|2018-01-16 05:00:00
7|3|out|2018-01-16 06:00:00
8|4|in|2018-01-16 07:00:00

根据每个用户的最后一次互动,我希望得到的是一个类型列等于'in'的所有乘客的数量,也就是说,我的预期结果将是这个

id|passenger_id|type|created_at
5|1|in|2018-01-16 04:00:00
8|4|in|2018-01-16 07:00:00

count = 2 rows

研究我能够得到一个迎合我的SQL查询,但我不知道如何使用Laravel来应用它

SELECT p.id, p.name, h1.id, h1.created_at, h1.type
FROM passengers p
JOIN histories h1 ON (p.id = h1.passenger_id)
LEFT OUTER JOIN histories h2 ON (p.id = h2.passenger_id AND (h1.created_at < h2.created_at OR h1.created_at = h2.created_at AND h1.id < h2.id))
WHERE h2.id IS NULL AND h1.type='in';

有人可以帮我在Laravel中安装此查询,或者如果我有另一个简单的解决方案,我很感激

1 个答案:

答案 0 :(得分:0)

在@edersoares的帮助下,我找到了解决方案,如果有人遇到同样的问题,它会被注册

$subquery = History::query()->selectRaw('MAX(id)')->groupBy('passenger_id');
$query = History::query()->whereIn('id', $subquery)->where('type', 'in');
$passengersIn = $query->get();