namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use InovantiBank\AdvancedQueryFilters\Services\FilterService;
use InovantiBank\AdvancedQueryFilters\Services\Filters\StringFilter;
use InovantiBank\AdvancedQueryFilters\Services\Filters\NumericFilter;
use InovantiBank\AdvancedQueryFilters\Services\Filters\DateFilter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Log;
use Exception;
class User extends Model
{
public static function boot()
{
parent::boot();
static::addGlobalScope('filters', function (Builder $query) {
$filters = request()->get('filters', []);
if (empty($filters) && request()->isJson()) {
$filters = request()->input('filters', []);
}
if (! empty($filters)) {
$formattedFilters = [];
foreach ($filters as $filter) {
$formattedFilters[$filter['field']] = $filter;
}
$filterService = new FilterService([
'name' => StringFilter::class,
'age' => NumericFilter::class,
'status' => ArrayFilter::class,
'email' => StringFilter::class,
'created_at' => DateFilter::class,
'is_active' => BooleanFilter::class,
'price' => NumericFilter::class,
'deleted_at' => NullFilter::class,
'range_field' => RangeFilter::class,
'profile.phone' => RelationFilter::class,
'profile.bio' => RelationFilter::class,
]);
if (request()->has('filters')) {
try {
$filterService->applyFilters($query, $formattedFilters);
} catch (Exception $e) {
Log::error('Erro ao aplicar filtros: '.$e->getMessage());
}
}
}
});
}
}
use Filters;
$translations = Filters::getFilterOperatorsTranslations();
return response()->json($translations);
namespace App\Filters;
use InovantiBank\AdvancedQueryFilters\Services\Interfaces\FilterInterface;
use Illuminate\Database\Eloquent\Builder;
class CustomFilter implements FilterInterface
{
public function apply(Builder $query, $value)
{
// Custom filter logic
}
}
case DYNAMIC = '';
case EQUAL = '=';
case LESS_THAN = '<';
case GREATER_THAN = '>';
case LESS_THAN_OR_EQUAL = '<=';
case GREATER_THAN_OR_EQUAL = '>=';
case NOT_EQUAL = '<>';
case LIKE = 'like';
case NOT_LIKE = 'not like';
case IN = 'in';
case NOT_IN = 'not in';
case BETWEEN = 'between';