Skip to content

Commit

Permalink
update methods
Browse files Browse the repository at this point in the history
  • Loading branch information
oooiik committed Oct 27, 2022
1 parent 3f93b8f commit dbeeaa5
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 5 deletions.
77 changes: 77 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Laravel Query Filter

In Laravel, it is convenient to write the query filter related to the model in a separate class!

### Installation

```
composer require oooiik/laravel-query-filter
```

### Usage:

for single use
```php
User::filter($validated)->get();
```
or create a filter
```php
$userFilter = User::createFilter(UserFilter::class);
```

get a query using a filter
```php
$userFilter->apply($validated)->query();
```
write filter on filter and get a query
```php
$userFilter->apply($validated);
$userFilter->apply($validated_2)->query();
```
filter cleaning and reuse
```php
$userFilter->resetApply($validated_3)->query();
```

In order to use a filter you have to create a new one by the command that is provided by the package:

```
php artisan make:filter UserFilter
```
This command will create a directory `Filters` and `UserFilter` class inside. To use the filter method of `User` model use the `Filterable` trait:

```php
<?php

namespace App\Models;

use Oooiik\LaravelQueryFilter\Traits\Model\Filterable;

class User extends Model
{
use Filterable;

```
And set the `defaultFilter` of a model by adding:

```php
protected $defaultFilter = UserFilter::class;
```
You can create a custom query by creating a new function in the `Filter` class, for example filtering books by publishing date:
```php
public function username($username)
{
$this->builder->where('username', $username);
}
// $validated = ['username' => 'name']
```
or filter by relationship:
```php
public function role($role)
{
$this->builder->whereHas('role', function($query) use ($role) {
$query->where('title', $role);
})
}
// $validated = ['role' => 'admin']

13 changes: 8 additions & 5 deletions src/Traits/Model/Filterable.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@
use Symfony\Component\ErrorHandler\Error\ClassNotFoundError;

/**
* @method static Builder filter(string $filter, array $validated = [])
* @method static Builder filter(array $validated = [])
* @property string $defaultFilter;
*/
trait Filterable
{
public function scopeFilter(Builder $query, $filter, array $validated = [])
// protected $defaultFilter;

public function scopeFilter(Builder $query, array $validated = [])
{
if (!class_exists($filter)) {
if (!class_exists($this->defaultFilter)) {
throw new ClassNotFoundError('Class not found', 500);
}
if (!is_subclass_of($filter, QueryFilter::class)) {
if (!is_subclass_of($this->defaultFilter, QueryFilter::class)) {
throw new ClassNotFoundError('It is not a successor class of Filter', 500);
}
return $filter::builder($query)->apply($validated)->query();
return $this->defaultFilter::builder($query)->apply($validated)->query();
}

/**
Expand Down

0 comments on commit dbeeaa5

Please sign in to comment.