Last active
October 22, 2020 10:04
-
-
Save opejovic/30f9726b796b7bb78bbb4b1f9220c44c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Utilities\Filters; | |
use Illuminate\Database\Eloquent\Builder; | |
use Illuminate\Http\Request; | |
class ActivityOnly implements Filter | |
{ | |
/** | |
* @inheritDoc | |
*/ | |
public static function apply(Builder $builder, Request $filters) | |
{ | |
// Return businesses only by activity | |
if ($filters->has('activity') && !$filters->has('q') && !$filters->has('location')) { | |
$builder->whereHas('activities', function ($query) use ($filters) { | |
$query->where('name', 'LIKE', "%{$filters->activity}%"); | |
}); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Utilities\Filters; | |
use Illuminate\Database\Eloquent\Builder; | |
use Illuminate\Http\Request; | |
class AllParams implements Filter | |
{ | |
/** | |
* @inheritDoc | |
*/ | |
public static function apply(Builder $builder, Request $filters) | |
{ | |
// Everything selected | |
if ($filters->has('q') && $filters->has('location') && $filters->has('activity')) { | |
$builder->where('name', 'LIKE', "%{$filters->q}%") | |
->whereHas('destinations', function ($query) use ($filters) { | |
$query->where('name', 'LIKE', "%{$filters->location}%"); | |
})->whereHas('activities', function ($query) use ($filters) { | |
$query->where('name', 'LIKE', "%{$filters->activity}%"); | |
}); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Utilities\Filters; | |
use Illuminate\Http\Request; | |
use Illuminate\Database\Eloquent\Builder; | |
interface Filter | |
{ | |
/** | |
* Apply a given search value to the builder instance. | |
* | |
* @param \Illuminate\Database\Eloquent\Builder $builder | |
* @param \Illuminate\Http\Request $filters | |
* @return \Illuminate\Database\Eloquent\Builder | |
*/ | |
public static function apply(Builder $builder, Request $filters); | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Utilities; | |
use App\Models\Business; | |
use App\Utilities\Filters\ActivityOnly; | |
use App\Utilities\Filters\AllParams; | |
use App\Utilities\Filters\LocationAndActivity; | |
use App\Utilities\Filters\LocationOnly; | |
use App\Utilities\Filters\StringAndActivity; | |
use App\Utilities\Filters\StringAndLocation; | |
use App\Utilities\Filters\StringOnly; | |
use Illuminate\Http\Request; | |
class SearchQuery | |
{ | |
/** | |
* Apply all the filters from the query string. | |
* | |
* @param \Illuminate\Http\Request $filters | |
* @return \Illuminate\Database\Eloquent\Builder | |
*/ | |
public static function apply(Request $filters) | |
{ | |
$query = Business::query(); | |
self::filters()->each(function ($filter) use ($query, $filters) { | |
$filter::apply($query, $filters); | |
}); | |
return $query->orderByRaw("name {$filters->order}"); | |
} | |
/** | |
* All the applicable filters. | |
*/ | |
private static function filters(): \Illuminate\Support\Collection | |
{ | |
return collect([ | |
AllParams::class, | |
StringOnly::class, | |
ActivityOnly::class, | |
LocationOnly::class, | |
StringAndLocation::class, | |
StringAndActivity::class, | |
LocationAndActivity::class, | |
]); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment