Laravel使用集合过滤器和地图

时间:2019-01-11 08:59:54

标签: php laravel filter

我有一种方法可以退还即将到来的付款日期。在下面的示例中,getNextDate()将返回Carbon日期,如下所示:

Carbon @1549788696 {#1119 ▼
  date: 2019-02-10 08:51:36.0 UTC (+00:00)
}

我基本上在数据库中有一堆subscriptions,并且我只想显示下一个即将到来的付款日期的one结果。

例如,假设我有三个订阅:

Subscription 1, getNextDate() will return: 2019-02-18
Subscription 2, getNextDate() will return: 2019-02-10
Subscription 3, getNextDate() will return: 2019-02-25

由于Subscription 2是下一个需要支付的即将到来的付款,因此我只想在视图中的小部件中显示那个。我将如何处理?例如使用过滤器或地图,如下所示?

$subscriptions = auth()->user()->subscriptions()->get();

$filtered = $subscriptions->filter(function ($subscription) {
    return $subscription->getNextDate();
});

dd($filtered);

这只会返回所有这些。但是,是否有一种方法可以对其进行过滤,以便仅获得下一个最接近的getNextDate()的结果?还是我应该以其他方式这样做?任何建议都可以。

PS。 getNextDate()只需获取start_date进行订阅,然后计算与Carbon::now()的月份差额,并检查到现在为止已支付了多少笔款项,然后返回下一个即将到来的付款日期。所以没什么幻想的。

1 个答案:

答案 0 :(得分:1)

我认为您不需要在这里使用filter()。我认为以下应该起作用。

$subscriptions = auth()->user()->subscriptions()->get();

$next = $subscriptions->sortBy(function ($subscription) {
    return $subscription->getNextDate()->timestamp;
})->first();

您需要按下一个日期的升序对收藏进行排序,并获得第一项。