Omda's avatar
Level 1

How could I remove duplication from pagination

this my helper method for a pagination


if(!function_exists('paginate')){
    /**
     * @param $items
     * @param int $perPage
     * @param null $page
     * @param array $options
     * @return array
     */
    function paginate($items, $perPage = 15, $page = null, $options = []): array
    {
        $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
        $items = $items instanceof Collection ? $items : Collection::make($items);

        $data = new LengthAwarePaginator($items->forPage($page, $perPage),
            $items->count(), $perPage, $page, $options
        );

        return $data->toArray();
    }
}
$sale_data = DB::table('transactions')
            ->Join('users','users.id','=','transactions.customer_id')
            ->selectRaw('
                SUM(CASE WHEN `transactions`.`transaction_type` = 1 THEN `transactions`.`total_amount` END)  AS sale,
                SUM(CASE WHEN  `transactions`.`transaction_type` = 1 THEN `transactions`.`max_factor_qty` END) AS max_factor_qty,
                SUM(CASE WHEN `transactions`.`transaction_type` = 2 THEN `transactions`.`total_amount` END)  AS sale_return,
                SUM(CASE WHEN `transactions`.`transaction_type` = 2 THEN `transactions`.`max_factor_qty` END)  AS max_factor_qty_return,
                `transactions`.`transaction_type` AS transaction_type,
                `transactions`.`route_id` AS route_id,
                `transactions`.`invoice_no` AS invoice_no,
                `users`.`id` AS customer_id,
                `users`.`code` AS customer_code,
                `users`.`name` AS customer_name
            ')
            ->whereRaw($column.$query)
            ->where('transactions.status', 3)
            ->groupBy('transactions.invoice_no', 'transactions.transaction_type');



$collection_data = paginate($sale_data->get(), $perPage, $page);

return response()->json($collection_data );

any Help?

0 likes
5 replies
Omda's avatar
Level 1

because build in is not let me pass per_page and I want to send result as JSON instead of view.

MichalOravec's avatar

This is built in pagination in Laravel

/**
 * Paginate the given query.
 *
 * @param  int|null  $perPage
 * @param  array  $columns
 * @param  string  $pageName
 * @param  int|null  $page
 * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
 *
 * @throws \InvalidArgumentException
 */
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
    $page = $page ?: Paginator::resolveCurrentPage($pageName);

    $perPage = $perPage ?: $this->model->getPerPage();

    $results = ($total = $this->toBase()->getCountForPagination())
                                ? $this->forPage($page, $perPage)->get($columns)
                                : $this->model->newCollection();

    return $this->paginator($results, $total, $perPage, $page, [
        'path' => Paginator::resolveCurrentPath(),
        'pageName' => $pageName,
    ]);
}

So what you want you get with this

return $sale_data->paginate($perPage, ['*'], 'page', $page);
Omda's avatar
Level 1

it worked. thanks for your replies

Tray2's avatar

Mark the reply that helped you solve your problem as best.

Please or to participate in this conversation.