【问题标题】:Laravel working with collection filter and mapLaravel 使用集合过滤器和地图
【发布时间】:2019-01-11 08:59:54
【问题描述】:

我有一种方法可以返回即将到来的付款日期。在下面的示例中,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() 的月差,并检查到目前为止已支付了多少付款,然后返回下一个即将到来的付款日期。所以没什么特别的。

【问题讨论】:

    标签: php laravel filter


    【解决方案1】:

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

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

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

    【讨论】:

    • 很高兴为您提供帮助:)
    • 你还需要集合排序吗?这应该可以通过添加 orderByRaw 并使用 first() 只得到 1 在查询中实现。您甚至可以使用 orderByRaw 传入 Carbon 计算。
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2018-04-16
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多