Skip to content

Instantly share code, notes, and snippets.

@opejovic
Last active October 22, 2020 10:04
Show Gist options
  • Save opejovic/30f9726b796b7bb78bbb4b1f9220c44c to your computer and use it in GitHub Desktop.
Save opejovic/30f9726b796b7bb78bbb4b1f9220c44c to your computer and use it in GitHub Desktop.
<?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}%");
});
}
}
}
<?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}%");
});
}
}
}
<?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);
}
<?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