Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I paginate an array of objects in Laravel?

I'm building an application using Laravel 4.2. I have a model for units and another for users and pivot table user_units. Every user in this application can select a unit and add it to his favorite list then he can publish this unit with his information as an ad.

I want to select all units published by all users

The user_units (pivot) table has the following columns:

id   
user_id 
unit_id 
publish      
adtype       
addinfo          
created_at  
updated_at

With relations methods on models

public function users() {
    return $this->belongsToMany('User', 'user_units')
                ->withPivot('id','publish', 'adtype', 'addinfo');
}

public function units() {
    return $this->belongsToMany('Unit', 'user_units')
                ->withPivot('id','publish', 'adtype', 'addinfo');
}

My query to select all published units by all users

// Get all published units by users for sale. 
    $users = User::all();
    $publishedSaleUnits = [];
    foreach($users as $user){
        $userUnits = $user->units()->orderBy('adtype', 'desc')->get();
        if(count($userUnits)){
            foreach($userUnits as $unit){
                if($unit->pivot->publish == 1 && $unit->unit_purpose_id == 1){
                    if( $unit->pivot->adtype ){
                        //push all featured ads onto the beginning of array
                        array_unshift($publishedSaleUnits, $unit);
                    }else{
                        //push all normal ads onto the end of array
                        array_push($publishedSaleUnits, $unit);
                    }
                }
            }
        }
    }

Now I got the result but I can't use pagination with results because it's an array of objects.

So is there any better solution to get all published units by user with pagination?

like image 946
Maged Hamid Avatar asked Nov 21 '14 15:11

Maged Hamid


2 Answers

according to this article https://www.itsolutionstuff.com/post/how-to-create-pagination-from-array-in-laravelexample.html

you can paginate your array by creating a custom method and using LengthAwarePaginator

namespace App\Http\Controllers;
  
use Illuminate\Http\Request;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
  
class PaginationController extends Controller
{
    public function index()
    {
        $myArray = [
            ['id'=>1, 'title'=>'Laravel CRUD'],
            ['id'=>2, 'title'=>'Laravel Ajax CRUD'],
            ['id'=>3, 'title'=>'Laravel CORS Middleware'],
        ];
  
        $data = $this->paginate($myArray);
        return view('paginate', compact('data'));
    }
   
    public function paginate($items, $perPage = 5, $page = null, $options = [])
    {
        $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
        $items = $items instanceof Collection ? $items : Collection::make($items);
        return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options);
    }
}
like image 152
Mahdi mehrabi Avatar answered Oct 19 '22 04:10

Mahdi mehrabi


Your approach to query the data is extremely inefficient. Fetch your data in one query. Nested traversing is not only hard to read but also a performance killer.

To the pagination problem:

Laravel provides a Pagignator Factory. With it you will be able to build your own Paginator with your own data.

It's as easy as

$units = Paginator::make($unit, count($unit), 10);

if you're using the Facade. Otherwise Illuminate\Pagination\Factory is the class you are looking for.

like image 6
thpl Avatar answered Oct 19 '22 04:10

thpl