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 - 以一对多关系获取最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 渴望加载多对多,仅获取一条记录(不是集合)
Laravel whereHas 检查嵌套关系中的最后一条最新记录