Table Class: paginazione con Laravel

// nel Controller
use DeployStudio\Style\Base\Table;

class ArticoliCategorieController extends Controller
{
	public function index(Request $request)
	{
		// preparo la collection senza all() o get() alla fine...
		$categorie = new Categoria;
		// recupero il numero totale delle righe...
		$conteggio = $categorie->count();
		// calcolo il numero di pagine...
		$paginatore = Table::getPages($conteggio);
		// recupero la collection limitata dal paginatore...
		$categorie = $categorie->skip($paginatore['offset'])
			->take($paginatore['limit'])->get();

		// passo il numero totale di elementi ala view per
		// mostrare correttamente il paginatore...
		return view('articoliCategorie.index',
			['categorie' => $categorie, 'totalElements' => $conteggio]);
	}
}

// nel Blade index.blade.html
{!! Table::open('fa fa-list', 'Lista', [], $cols, ['totalElements' => $totalElements]) !!}
{!! Table::rows(...) !!}
{!! Table::close() !!}

Table Class: filtri e ordinamenti con Laravel

// nel Controller
class ArticoliCategorieController extends Controller
{
	public function index(Request $request)
	{
		// eventuale recupero di una ricerca precedente (indicare ?fret=1 nel query string)
		$chiave_ricerca = 'la.mia.pagina';
		if ($request->fret) {
			foreach (session($chiave_ricerca, []) as $k => $v) {
				$request->$k = $v;
			}
		} else {
			session([$chiave_ricerca => $request->all()]);
		}

		// se e' richiesta una relazione esterna, l'uso di with e' fortemente raccomandato
		$objects = Model::with('relation_name');

		// ordina
		$default_sort = 'col1';
		$default_dir = 'asc';
		$sort = !empty($request->sort) ? $request->sort : $default_sort;
		$dir = isset($request->dir) && in_array($request->dir, ['asc', 'desc']) ? $request->dir : $default_dir;

		$available_sorts = ['col1_external', 'col2'];
		if (in_array($sort, $available_sorts)) {
			switch ($sort) {
				// definisci qui i casi particolari
				case 'col2':
					//...
					break;

				// esempio di una relazione esterna
				case 'col1_external':
					$objects->join('external_table', 'external_table.id', 'mytable.id')
						->orderBy('col1_external', $dir);
					break;
					
				default:
					$objects = $objects->orderBy($sort, $dir);
					break;
			}
		}

		// filtra
		$available_filters = ['col1_external', 'col2', 'col3'];
		foreach ($available_filters as $filter) {
			$ffilter = 'f'.$filter;
			if (!empty($request->$ffilter) > 0) {
				switch ($filter) {
					// definisci qui i casi particolari
					case 'col2':
						//...
						break;

					// esempio di una relazione esterna
					case 'col1_external':
						$objects = $objects->whereHas('relation_name', function($q) use ($request, $ffilter) {
							$q->where('nome', "LIKE", '%'.$request->$ffilter.'%');
						});
						break;
							
					default:
						$objects = $objects->where($filter, "LIKE", '%'.$request->$ffilter.'%');
				}
			}
		}

		// filtri date
		$available_filters_date = ['col4_date'];
		foreach ($available_filters_date as $date_filter) {
			$startDate = '';
			$endDate = '';
			$filter_date_start = 'f'.$date_filter.'_start';
			$filter_date_end = 'f'.$date_filter.'_end';
			if (!empty($request->$filter_date_start) > 0 && !empty($request->$filter_date_end) > 0) {
				$startDate = date('Y-m-d 00:00:00', $request->$filter_date_start / 1000);
				$endDate = date('Y-m-d 23:59:59', $request->$filter_date_end / 1000);
			}
			if (strlen($startDate) > 0 && strlen($endDate) > 0) {
				$objects = $objects->whereBetween($date_filter, array($startDate, $endDate));
				unset($startDate);
				unset($endDate);
			}
		}
			
		$objects = $objects->get();

		return view('articoliCategorie.index', ['sort' => $sort, 'sort_dir' => $dir]);
	}
}

// nel Blade index.blade.html
{!! Table::open('fa fa-list', 'Lista', [], $cols, ['sort' => $sort, 'sort_dir' => $sort_dir]) !!}
{!! Table::rows(...) !!}
{!! Table::close() !!}