diff --git a/app/Home.php b/app/Home.php index ff8c1de..b4769bb 100644 --- a/app/Home.php +++ b/app/Home.php @@ -4,6 +4,7 @@ namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; +use Spatie\QueryBuilder\QueryBuilder; class Home extends Model { @@ -21,4 +22,34 @@ class Home extends Model { return Str::words($this->description, 10); } + + public function scopePriceMax(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('price', '<=', $price); + } + + public function scopePriceMin(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('price', '>=', $price); + } + + public function scopeSurfaceMax(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('surface', '<=', $price); + } + + public function scopeSurfaceMin(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('surface', '>=', $price); + } + + public function scopeGardenSurfaceMax(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('garden_surface', '<=', $price); + } + + public function scopeGardenSurfaceMin(QueryBuilder $query, $price): QueryBuilder + { + return $query->where('garden_surface', '>=', $price); + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index eba90d0..b322ad9 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers; use App\Home; use App\Parser; use Illuminate\Http\Request; +use Spatie\QueryBuilder\AllowedFilter; +use Spatie\QueryBuilder\QueryBuilder; class HomeController extends Controller { @@ -15,7 +17,21 @@ class HomeController extends Controller */ public function index() { - $homes = Home::all(); + $homes = QueryBuilder::for(Home::class) + ->allowedFilters([ + AllowedFilter::scope('price_min'), + AllowedFilter::scope('price_max'), + + AllowedFilter::scope('surface_min'), + AllowedFilter::scope('surface_max'), + + AllowedFilter::scope('garden_surface_min'), + AllowedFilter::scope('garden_surface_max'), + ]) + ->defaultSort('-created_at') // https://docs.spatie.be/laravel-query-builder/v2/features/sorting/#basic-usage + ->paginate(10) + ->appends(request()->query()); + return view('homes.home', ['homes' => $homes]); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5b..1e5338e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Str; class AppServiceProvider extends ServiceProvider { @@ -23,6 +24,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + Str::macro('currency', static function ($price) + { + return sprintf('%s €', number_format($price, 0, ',', ' ')); + }); } } diff --git a/composer.json b/composer.json index 44a5c4d..a4a9eb7 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ "guzzlehttp/guzzle": "^6.3", "laravel/framework": "^7.0", "laravel/tinker": "^2.0", - "laravel/ui": "^2.1" + "laravel/ui": "^2.1", + "spatie/laravel-query-builder": "^2.8" }, "require-dev": { "facade/ignition": "^2.0", diff --git a/composer.lock b/composer.lock index 9256b34..678827e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "01ffe58a603d5640b76b6f85688ea1a8", + "content-hash": "71386ccf87ea9b8b3be2921f40baca69", "packages": [ { "name": "absmoca/leboncoin", @@ -2234,6 +2234,70 @@ ], "time": "2020-03-29T20:13:32+00:00" }, + { + "name": "spatie/laravel-query-builder", + "version": "2.8.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-query-builder.git", + "reference": "2737b2298e8bfeb632a80013646943307bf31775" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-query-builder/zipball/2737b2298e8bfeb632a80013646943307bf31775", + "reference": "2737b2298e8bfeb632a80013646943307bf31775", + "shasum": "" + }, + "require": { + "illuminate/database": "~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/http": "~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0", + "illuminate/support": "~5.6.34|~5.7.0|~5.8.0|^6.0|^7.0", + "php": "^7.1" + }, + "require-dev": { + "ext-json": "*", + "orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\QueryBuilder\\QueryBuilderServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\QueryBuilder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily build Eloquent queries from API requests", + "homepage": "https://github.com/spatie/laravel-query-builder", + "keywords": [ + "laravel-query-builder", + "spatie" + ], + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2020-05-25T09:36:37+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.3", diff --git a/config/query-builder.php b/config/query-builder.php new file mode 100644 index 0000000..68511d6 --- /dev/null +++ b/config/query-builder.php @@ -0,0 +1,32 @@ + [ + 'include' => 'include', + + 'filter' => 'filter', + + 'sort' => 'sort', + + 'fields' => 'fields', + + 'append' => 'append', + ], + + /* + * Related model counts are included using the relationship name suffixed with this string. + * For example: GET /users?include=postsCount + */ + 'count_suffix' => 'Count', + +]; diff --git a/resources/views/homes/home.blade.php b/resources/views/homes/home.blade.php index b228845..14e7c33 100644 --- a/resources/views/homes/home.blade.php +++ b/resources/views/homes/home.blade.php @@ -3,7 +3,7 @@ @section('content')
-
+
{{ __('Dashboard') }}
@@ -15,19 +15,51 @@ @endif
+
+

+ +

+
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
@if(count($homes) > 0) @foreach($homes as $home) -
+
-
{{ $home->title }}
+
+ {{ $home->title }} + {{ Str::currency($home->price) }} +

{{ $home->excerpt() }}

Voir la maison
@endforeach +
+ {{ $homes->links() }} +
@else Aucune maison enregistrée :( @endif