Как использовать Laravel Collection groupBy вместе с Query Pagination? - PullRequest
0 голосов
/ 07 июня 2018

Мне нравится использовать функцию Laravel groupBy https://laravel.com/docs/5.6/collections#method-groupby

Однако я не могу использовать ее с функцией paginate (x), поскольку она возвращает ограниченное количество результатов.Groupby для SQL Query и GroupBy от Laravel Collections совершенно разные.Если я использую groupby в своем запросе, это не даст мне то, что я хочу.Например, я просто хочу набрать, и я получил все, что хочу.

$notifications = $notifications->groupBy('order_id');

Например, это мой запрос

    $notifications = DB::table('sent_notifications as a')
        ->join('sent_notification_results as b', 'a.sent_notification_result_id', '=', 'b.sent_notification_result_id')
        ->join('orders as c', 'c.order_id', '=', 'a.order_id')
        ->join('sellers as d', 'c.seller_id', '=', 'd.seller_id')
        ->join('companies as e', 'd.company_id', '=', 'e.company_id')
        ->join('notification_templates as f', 'f.notification_template_id', '=', 'a.notification_template_id')
        ->join('notification_types as g', 'g.notification_type_id', '=', 'f.notification_type_id')
        ->join('default_notification_templates as h', 'h.default_notification_template_id', '=', 'f.default_notification_template_id')
        ->where('e.company_id', $company_id)
        ->select('*')
        ->orderBy('a.created_at','DESC')
        ->paginate(20);
    $pagination_links = $notifications->links();

Как я могу использовать групповой метод Collection наряду с нумерацией страниц?

1 Ответ

0 голосов
/ 06 июля 2018

Я работал над проектом с похожей проблемой и придумал это решение.

public function index(Request $request)
{
    $posts = Post::all()
        ->paginate($request->get('per_page', 25));

    $grouped_by_date = $posts->mapToGroups(function ($post) {
        return [$post->published_date => $post];
    });
    $posts_by_date = $posts->setCollection($grouped_by_date);

    return view('posts.index', compact('posts_by_date'));
}
...