در این مقاله میخواهم پکیج کاربردی (Advanced Eloquent Model Filters) را بهتون معرفی کنم. وظیفهی این پکیج ایجاد فیلترهای از پیش آماده شده برای ما میباشد اما چطور؟
احتمالا تاحالا در برخی از پروژهها برای شما پیش آمده که خواستید یک سری فیلترهای خاصی را بر روی کوئریهای خود اعمال کنید و مجبور شدید که این فیلترها را در جاهای مختلف کنترلرهای خود بنویسید. این پکیج باعث میشه که شما فیلترهای خود را در یک پوشهی مشخص، در کلاس مربوطهی خود به صورت مرتب شده بنویسید و فقط این کلاسها را در جاهای مختلف فراخوانی کنید. در این صورت کدهای شما بسیار منظمتر و خواناتر خواهد شد.و اما بریم سراغ آموزش پکیج...
ابتدا دستور زیر را برای نصب پکیج وارد کنید.
composer require pricecurrent/laravel-eloquent-filters
با اجرای دستور بالا پکیج مربوطه نصب شد، حالا trait زیر را در مدلی که میخواهید دادههای آن را فیلتر کنید، یوز کنید (در مثال زیر ما در مدل یوزر این کار را انجام میدهیم)
use Pricecurrent\LaravelEloquentFilters\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; }
حال شما باید کلاس مربوطه را برای ایجاد فیلترهایی که میخواهید بسازید.نام کلاس را بر اساس نوع فیلتر خود انتخاب کنید. (با دستور زیر)
php artisan eloquent-filter:make NameFilter
با اجرای دستور بالا یک کلاس با نام NameFilter برای شما در پوشهی app/Filters ایجاد شده است. (مطابق عکس)
حال در کلاس ایجاد شده ما فیلتر خود را بر روی کوئریهای مدل User اعمال میکنیم. در اینجا ما اسامی کاربران را با دستور LIKE جستجو میکنیم.
use App\Filters; use Illuminate\Database\Eloquent\Builder; use Pricecurrent\LaravelEloquentFilters\AbstractEloquentFilter; class NameFilter extends AbstractEloquentFilter { protected $name; public function __construct($name) { $this->name = $name; } public function apply(Builder $builder): Builder { return $builder->where('name', 'like', "{$this->name}%"); } }
در نهایت در کنترلر خود، کلاس مربوطه (NameFilter) را فراخوانی میکنیم و در کوئری خود از آن استفاده میکنیم.
use App\Filters\NameFilter; use App\Models\User; use Illuminate\Http\Request; use Pricecurrent\LaravelEloquentFilters\EloquentFilters; class UserController extends Controller { public function index() { $filters = EloquentFilters::make([new NameFilter("example")]); return User::filter($filters)->get(); } }
حتی میتوانیم از فیلترهای خود برای ریکوئستهای دریافتی از سمت کاربر هم استفاده کنیم.
use App\Filters\NameFilter; use Pricecurrent\LaravelEloquentFilters\EloquentFilters; class ProductsController { public function index(Request $request) { $filters = EloquentFilters::make([new NameFilter($request->name)]); $products = Product::filter($filters)->get(); } }
اطلاعات بیشتر را میتوانید در آدرس گیتهاب زیر کسب کنید. (موفق باشید)
https://github.com/pricecurrent/laravel-eloquent-filters