HERE IS THE QUERYFILTERS INHERITED BY THE PRODUCTFILTERS
@jlrdw
<?php
namespace App;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
abstract class QueryFilter
{
protected $request;
protected $builder;
public function __construct(Request $request)
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
foreach($this->filters() as $name => $value){
if(method_exists($this, $name)){
call_user_func_array([$this, $name], array_filter([$value]));
}
}
return $this->builder;
}
public function filters()
{
return $this->request->all();
}
}
THE PRODUCT FILTER
<?php
namespace App;
class ProductFilters extends QueryFilter
{
// THIS IS THE ONLY FILTER FOR NOW, IT WILL GROW TO 50 MAYBE.
public function price($order = 'desc')
{
return $this->builder->orderBy('price', $order);
}
THE CONTROLLER
public function index(ProductFilters $filters)
{
$products = Product::filter($filters)->paginate(10);
return view('products', compact('products'));
}
THE ROUTE
Route::resource('products', 'ProductController');
THE BLADE
@foreach(array_chunk($products->getCollection()->all(), 4) as $row)
<div class="row">
@foreach($row as $product)
<div class="mediapic col-md-3" id="mediapic">
<a href="products/{{$product->id}}">
<img class="card-img-top rounded mediapic2" src="https://picsum.photos/512/512" alt="Card image cap"
width="250" height="250">
<a href="#" class="btn btn-primary btn-sm">Check it out</a>
</a>
<div class="bottom-left">
{{$product->title}}
<h6><strong>{{$product->price}}</strong></h6>
</div>
</div>
@endforeach
</div>
@endforeach
</div>
{{ $products->appends(request()->query())->links() }}