Laravel - 以一对多关系获取最后一条记录

Posted

技术标签:

【中文标题】Laravel - 以一对多关系获取最后一条记录【英文标题】:Laravel - Get last record with condition in one-to-many relationship 【发布时间】:2018-06-26 07:44:39 【问题描述】:

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

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 中安装这个查询,或者如果我有另一个简单的解决方案,我很感激

【问题讨论】:

最后一次交互来自“created_at”列。每次检查乘客时,我都会根据最后的记录交替输入/输出类型。如果这是该乘客第一次注册,则假定类型列的值为“in” - 感谢您尝试帮助我。 【参考方案1】:

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

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

【讨论】:

以上是关于Laravel - 以一对多关系获取最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中有效地获取一对多关系中的最新记录

laravel 多条记录到一条记录....但是如何?

Laravel - 渴望加载多对多,仅获取一条记录(不是集合)

Laravel whereHas 检查嵌套关系中的最后一条最新记录

无法删除一对多关系中的记录 laravel eloquent

sql 一对多的查询