Laravel仅返回关系中最后一项等于要求的记录

时间:2017-09-28 10:12:41

标签: php laravel laravel-5

我正在为有用户和预订的应用做一些报告。

目的是让所有在过去2个月内没有预订的用户退回。

我的查询目前返回所有曾在预定团队预订的用户,并按最新到最早订购预订。

我的问题是,我如何只返回上次预订的用户预计超过2个月的预订时间?

我目前的查询是:

$collection = User::whereHas('customerBookings', function($q) use ($teamId) {
    $q->where('team_id', $teamId);
})->with(['customerBookings' => function ($q) use ($teamId) {
    $q->where('team_id', $teamId);
    $q->orderBy('estimated_booking_time', 'desc');
}])
->get();

这会正确返回所有具有预订(与预订表的关系)的用户,这些用户拥有所请求的team_id,然后只返回符合相同要求的预订。

我打算在集合中使用 - >拒绝,但我宁愿过滤掉查询本身。

理想情况下,我想在with claus中添加一些东西:

$q->where( FIRST RELATIONSHIP ITEM ->estimated_booking_time, '<=', Carbon::now()->subMonths(2) );

我的问题是如何从关系中获取第一个项目并使用它仅根据最后一项返回用户。

2 个答案:

答案 0 :(得分:0)

您可以将where()上次预订的时间(例如2个月前)减去时间now。您可能还有look at this reference。我认为这与你的相似。

答案 1 :(得分:0)

可能您在用户和预订模型之间存在多种关系。 用户模型确实有一个&#34;预订()&#34;与预订模式相关的方法。

说,你可以这样做:

$users = \App\User::whereHas('bookings', function ($query) {
     $query->where('lestimated_booking_time', '<=', Carbon::now()->subMonths(2));
});