Laravel Resource тоже добавляет в мета пагинацию со стандартным paginate(). В чем точно проблема не понял. Я делаю фильтрацию с помощью модуля
class Filter
{
protected $builder;
protected $request;
public function __construct($builder, $request)
{
$this->builder=$builder;
$this->request=$request;
}
public function run()
{
foreach ($this->request->all() as $filter => $value)
{
if (method_exists($this, $filter) and !empty($value))
{
$this->$filter($value);
}
}
return $this->builder;
}
//------------------Фильтры-----------------------------------
private function name($value)
{
$this->builder->where('name', 'like', "%$value%");
}
private function type_id($value)
{
$this->builder->where('type_id', $value);
}
}
модуль получает билдер и реквест из контроллера. Затем перебирает данные реквеста и если название метода класса совпадает с названием из реквеста то он обновляет билдер и в финале возвращает отфильтрованный билдер. Т.е. название методов фильтрации должны совпадать с названиями из реквеста.
Затем сортировку через переменные.
->orderBy($field, $metod);
Для сортировки создал модель Sorting где есть поле code с названиями полей сортируемых моделей типа updated_at или lists_count (для отношений withCount). Это передается в orderBy и сортируется. Т.е. вначале строится билдер, затем сортировка и пагинация. Все что получилось в итоге отдаю обратно через ресурс типа
return ProductResource::collection($products);