PHP code example of mohammad-fouladgar / eloquent-builder

1. Go to this page and download the library: Download mohammad-fouladgar/eloquent-builder library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

mohammad-fouladgar / eloquent-builder example snippets


$users = User::where('is_active', true);

if ($request->has('age_more_than')) {
    $users->where('age', '>', $request->age_more_than);
}

if ($request->has('gender')) {
    $users->where('gender', $request->gender);
}

if ($request->has('has_published_post')) {
    $users->whereHas('posts', function ($query) use ($request) {
        $query->where('is_published', $request->has_published_post);
    });
}

return EloquentBuilder::model(User::class)
    ->filters($request->filter)
    ->thenApply()
    ->get();



namespace App\EloquentFilters\User;

use Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;

class AgeMoreThanFilter extends Filter
{
    public function apply(Builder $builder, mixed $value): Builder
    {
        return $builder->where('age', '>', $value);
    }
}

use App\Models\User;

return EloquentBuilder::model(User::class)
    ->filters($request->filter)
    ->thenApply()
    ->get();

Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter



namespace App\EloquentFilters\User;

use Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;

class AgeMoreThanFilter extends Filter
{
    public function apply(Builder $builder, mixed $value): Builder
    {
        return $builder->where('age', '>', $value);
    }
}

$users = EloquentBuilder::model(User::class)
    ->filters(request()->filter)
    ->thenApply()
    ->get();

$query = User::where('is_active', true);

$users = EloquentBuilder::model($query)
    ->filters(request()->filter)
    ->thenApply()
    ->where('city', 'london')
    ->get();

$users = EloquentBuilder::model(new User())
    ->filters(request()->filter)
    ->filter(['age_more_than' => '30'])
    ->filter(['gender' => 'female'])
    ->thenApply()
    ->get();

$users = User::filter(request()->filter)->get();

$users = User::where('is_active', true)
    ->filter(request()->filter)
    ->get();

$request->filter

use Fouladgar\EloquentBuilder\Support\Foundation\Concrete\QuickFilter;

EloquentBuilder::model(User::class)
    ->quickFilters([
        QuickFilter::exact('gender'),
        QuickFilter::partial('name'),
        QuickFilter::scope('online'),
        QuickFilter::callback(
            'has_posts',
            fn (Builder $builder, mixed $value) =>
                $builder->whereHas('posts')
        ),
        QuickFilter::trashed(),
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

QuickFilter::exact('status')

$query->where('status', 'active');

QuickFilter::exact('user_status', 'status')

$query->where('status', 'active');

QuickFilter::partial('name')

$query->where('name', 'LIKE', '%john%');

QuickFilter::partial('search', 'name')

public function scopeOnline(Builder $query, mixed $value): Builder
{
    return $query->where('is_online', $value);
}

QuickFilter::scope('online')

QuickFilter::scope('active', 'online')

QuickFilter::callback(
    'has_posts',
    fn (Builder $builder, mixed $value) =>
        $builder->whereHas('posts')
)

Builder $builder
mixed $value

QuickFilter::trashed()

$query->withTrashed();

$query->onlyTrashed();

QuickFilter::trashed('deleted')

QuickFilter::
    'posts.comments',
    'profile',
])

[
    'posts',
    'posts.comments',
]

QuickFilter::ser',
])

QuickFilter::fields('fields', [
    'id',
    'name',
    'email',
])

QuickFilter::exact('status')

use Fouladgar\EloquentBuilder\Support\Foundation\Concrete\FilterGroup;

EloquentBuilder::model(User::class)
    ->filterGroups([
        FilterGroup::or([
            'status',
            'is_featured',
        ]),
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

EloquentBuilder::model(User::class)
    ->quickFilters([
        QuickFilter::exact('status'),
    ])
    ->defaults([
        'status' => 'online',
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

EloquentBuilder::model(User::class)
    ->quickFilters([
        QuickFilter::exact('status'),
    ])
    ->ignoreValues([
        'status' => ['all'],
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

EloquentBuilder::model(User::class)
    ->quickFilters([
        QuickFilter::exact('status'),
    ])
    ->ignoreValues([
        'status' => ['all'],
    ])
    ->defaults([
        'status' => 'online',
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

ignoreValues([
    'id' => [0],
])



namespace App\EloquentFilters\User;

use Fouladgar\EloquentBuilder\Concerns\FiltersDatesTrait;
use Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;

class BirthDateFilter extends Filter
{
    use FiltersDatesTrait;

    public function apply(Builder $builder, mixed $value): Builder
    {
        return $this->filterDate(
            $builder,
            $value,
            'birth_date'
        );
    }
}



namespace App\EloquentFilters\User;

use Fouladgar\EloquentBuilder\Concerns\FiltersNumbersTrait;
use Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;

class ScoreFilter extends Filter
{
    use FiltersNumbersTrait;

    public function apply(Builder $builder, mixed $value): Builder
    {
        return $this->filterNumber(
            $builder,
            $value,
            'score'
        );
    }
}



namespace App\EloquentFilters\User;

use Fouladgar\EloquentBuilder\Concerns\SortableTrait;
use Fouladgar\EloquentBuilder\Support\Foundation\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;

class SortByFilter extends Filter
{
    use SortableTrait;

    protected array $sortable = [
        'birth_date',
        'score',
    ];

    public function apply(Builder $builder, mixed $value): Builder
    {
        return $this->applySort($builder, $value);
    }
}

protected array $sortable = [
    'birth_date',
    'score',

    'posts_count' => function (
        Builder $builder,
        string $direction
    ): Builder {
        return $builder
            ->withCount('posts')
            ->orderBy('posts_count', $direction);
    },
];

EloquentBuilder::model(User::class)
    ->defaults([
        'sort_by' => [
            'created_at' => 'desc',
        ],
    ])
    ->filters($request->filter)
    ->thenApply()
    ->get();

public function authorize(): bool
{
    return auth()->user()->hasPremiumAccount();
}

'ignore_missing_filters' => true,

return [
    'namespace' => 'App\\EloquentFilters\\',
];

$stores = EloquentBuilder::model(\Domains\Entities\Store::class)
    ->filters($request->all())
    ->setFilterNamespace('Domains\\Store\\Filters')
    ->thenApply()
    ->get();



namespace App\Controllers;

use App\Models\User;
use Fouladgar\EloquentBuilder\EloquentBuilder;
use Illuminate\Http\Request;

class UserController
{
    public function index(
        Request $request,
        User $user,
        EloquentBuilder $builder
    ) {
        $users = $user->newQuery()
            ->where('is_active', true);

        $builder
            ->model($users)
            ->filters($request->filter)
            ->thenApply();

        return $users->get();
    }
}
text
app/
└── EloquentFilters/
    └── User/
        ├── AgeMoreThanFilter.php
        └── GenderFilter.php
bash
php artisan eloquent-builder:make user age_more_than
bash
php artisan eloquent-builder:make user age_more_than gender
http
/api/users?filter[age_more_than]=25&filter[gender]=male
http
GET /api/users?filter[user_status]=active
http
GET /api/users?filter[has_posts]=1
text
posts.user
http
GET /api/users?birth_date=before:2018-01-01
http
birth_date=between:2018-01-01,2022-01-01
http
birth_date=2018-01-01,2022-01-01
http
birth_date[]=2018-01-01&birth_date[]=2022-01-01
http
birth_date=equals:2018-01-01
http
birth_date=same:2018-01-01
http
birth_date=2018-01-01
bash
php artisan vendor:publish \
    --provider="Fouladgar\EloquentBuilder\ServiceProvider" \
    --tag="config"
text
Domains/
├── Store/
│   └── src/
│       └── Filters/
│           └── StoreFilter.php
│
└── User/
    └── src/
        └── Filters/
            └── UserFilter.php