2017-07-18 3 views
1
$results = Result::orderBy("created_at", "asc") 
    ->whereBetween('created_at', array($from, $to)) 
    ->get() 
    ->groupBy(function($date) use($interval) { 
     return Carbon::parse($date->created_at)->format($interval); 
    }); 

ユーザーがフロントエンドで選択した内容に応じて、結果を日/週/月にグループ化しようとしています。Laravel groupBy Carbonを使用してグループ化された配列の長さが予期せず制限される

上記の結果はグループ単位で返されますが、奇妙な制限が加えられます。

私の$from/$toの期間は2年間です。

$intervalが「d」の場合、31グループ(1か月で31日)だけが返されます。したがって、最初の31日間をグループとして返​​すだけです。

$intervalが「W」の場合、52グループ(1年に52週間)だけが返されます。だから最初の52週間だけをグループとして返​​すべきだ。

$intervalが「m」の場合、12グループ(1年に12カ月)だけが返されます。だから最初の12ヶ月だけをグループとして返​​すべきです。

グループ化された結果の数にこれらの制限が実装されている理由について説明できません。多くの人がこの方法を使って日付でグループ化しているようですが、同じ問題を参照している他の人は見つけられません。

+0

12か月のグループには両方の年の結果がないか、代わりに24か月のグループが予想されますか? – apokryfos

+0

私は24のグループがあると思っていますが、それは12に制限しています。 –

答えて

2

Xでグループ化する必要があります。それ以外の場合は、両方の年の値を同じバケットに入れます。

たとえば月単位でグループ化すると、同じフォーマット「M = 01」に一致するため、2017年1月から2016年1月の値までの値が得られます。

$results = Result::orderBy("created_at", "asc") 
->whereBetween('created_at', array($from, $to)) 
->get() 
->groupBy(function($date) use($interval) { 
    return Carbon::parse($date->created_at)->format("Y ".$interval); 
}); 
+0

ありがとう、非常に感謝! –

関連する問題