مهدی فتحی
مهدی فتحی
خواندن ۴ دقیقه·۵ سال پیش

معرفی پکیج کاربردی Eloquent Filter در لاراول

تا حالا تجربه ساخت صفحات گزارش گیری ادمین یا ساخت صفحات با فیلتر های جستجوی متعدد در لاراول داشتید؟اگر پیاده سازی این قبیل امکانات را تجربه کردید.قطعا میدونید که ساخت این قبیل صفحات نیازمند دریافت یکسری داده از کاربر و ساخت کوعری بر اساس اون داده ها هست.امروز پکیج Eloquent filter رو معرفی میکنم که این مشکل رو خیلی راحت حل میکنه و دیگه نیازی نیست درگیر پیچیدگی های کوعری های صفحات فیلتر بشید و حتی نیازی نیست خیلی از کوعری ها رو خودتون بزنید  و کوعری ها با استفاده از پارامتر های query string ساخته می شوند.فکر میکنم با مثال بهتر منظور خودم رو برسونم.

Jenga
Jenga


اولین راه حل =! بهترین راه حل

اولین راه حلی که به ذهن اکثر توسعه دهنده ها میرسه اینه که برای هر داده ورودی یک نوع کوعری بسازیم.خب این مشکل با این راه حل حل میشه ولی قطعا در آینده کدهایی خواهید داشت که ده ها دستور شرطی برای هر نوع فیلد دارند.که قطعا پیچیدگی زیادی به کد شما وارد می کند و همچنین خوانایی کد شما کاهش می یابد.به طور مثال این نوع url را ببینید:

http://localhost:8000/users/search?age_more_than=25&gender=male&created_at=25-09-2019


https://gist.github.com/mehdi-fathi/fb03bf7eb1f817aecb06c1a61f9ff221

کد بالا نحوه پیاده سازی در روش قدیمی هست همانطور که می بینید برای هر نوع دیتا یک دستور شرطی درست شده است. البته شاید بشه حالا فرض کنید در اینده فیلتر شما کمی پیشرفته تر شود اون موقع نگهداری و پیاده سازی امکانات جدید یه مقدار پیچیده و سخت خواهد شد.

معرفی Eloquent Filter

تصور کنید شما یک پکیج نصب کنید که با استفاه از یسری قواعد query string شما رو تبدیل به یسری از شرط های mysql کند و کلا پیچیدگی پیاده سازی این قبیل امکانات رو بر عهده بگیره در ضمن حتی برخی کوعری ها را با توجه به پارامتر های ورودی بسازه. شما فقط دیتاهای مورد نظر رو به صورت query string به Controller خودتون تو فریم ورک لاراول پاس دهید همین‌!.قطعا این پکیج میتونه سرعت و تمیزی کد شما رو بالاتر ببره.

نصب و پیاده سازی

به تازگی ورژن جدید eloquent filter منتشر شده همراه با ویژگی های بسیار کاربردی که میتونید از لینک گیت هاب جدیدترین نسخه آن که ورژن ۲ این پکیج هست را نصب و استفاده کنید.برای دریافت نسخه جدید این لینک را کلیک کنید.

اول با استفاده از composer پکیج را نصب میکنیم.

$ composer require mehdi-fathi/eloquent-filter:1.6.9

پیاده سازی در Model

طبق کد زیر باید Filterable trait را به مدل خودتون اضافه کنید.همچنین فیلد های که میخواهید در فیلتر استفاده کنید باید در whiteListFilter مقدار دهی کنید.

https://gist.github.com/mehdi-fathi/131a9b4339f59265a899a38dd41a5a29

با این مقدار دهی میتوانید همه ی فیلد ها را برای فیلتر باز بگذارید.


private static $whiteListFilter = ['*'];

پیاده سازی در Controller

https://gist.github.com/mehdi-fathi/75b647d421aca420b9ed0c6ec781df6b

به همین سادگی حالا فقط کافیه داده ها از سمت  blade laravel به سمت کنترولر ارسال شود تا خروجی کوعری تولید شود.

مثال های استفاده از پکیج

دستورات شرطی ساده

پارامتر های ارسالی GET موجب ساخت کوعری های به شکل زیر می شود.(به صورت کاملا خودکار)

/users/list?email=mehdifathi.developer@gmail.com SELECT ... WHERE ... email = 'mehdifathi.developer@gmail.com' /users/list?first_name=mehdi&last_name=fathi SELECT ... WHERE ... first_name = 'mehdi' AND last_name = 'fathi' /users/list?username[]=ali&username[]=ali22&family=ahmadi SELECT ... WHERE ... username = 'ali' OR username = 'ali22' AND family = 'ahmadi'

عملگر ها در دستورات شرطی

شما می توانید عملگر ها را داخل پارامتر بدین صورت استفاده کنید.

/users/list?count_posts[operator]=>&count_posts[value]=35 SELECT ... WHERE ... count_posts > 35 /users/list?username[operator]=!=&username[value]=ali SELECT ... WHERE ... username != 'ali' /users/list?count_posts[operator]=<&count_posts[value]=25 SELECT ... WHERE ... count_posts < 25

شما می توانید پارمترهای limit , orderby را در URL ست کنید.

/users/list?f_params[limit]=1 SELECT ... WHERE ... order by `id` desc limit 1 offset 0 /users/list?f_params[orderBy][field]=id&f_params[orderBy][type]=ASC SELECT ... WHERE ... order by `id` ASC limit 10 offset 0

شرط های پیشرفته

برای ساخت کوعری های در یک بازه خاص مثه کوعری های بر حسب تاریخ باید پارامتر ها به این صورت ارسال شود.

/users/list?created_at[start]=2016/05/01&created_at[end]=2017/10/01 SELECT ... WHERE ... created_at BETWEEN '2016/05/01' AND '2017/10/01'

شما میتوانید تمام این شرط ها را داخل یک سری از پارامترها به پکیج ارسال کنید.

/users/list?count_posts[operator]=>&count_posts[value]=10&username[]=ali&username[]=mehdi&family=ahmadi&created_at[start]=2016/05/01&created_at[end]=2020/10/01
&f_params[orderBy][field]=id&f_params[orderBy][type]=ASC

select * from `users` where `count_posts` > 10 and `username` in ('ali', 'mehdi') and
`family` = ahmadi and `created_at` between '2016/05/01' and '2020/10/01' order by 'id' asc limit 10 offset 0

 برای راهنمایی بیشتر می توانید فایل README.md این پکیج را مشاهده کنید.

فقط توجه داشته باشید فیلد هایی که می خواهید شرط ها را رو آن اعمال شود.باید داخل آرایه whiteListFilter$ ست شده باشد.


اگر نظر یا ایده ای درباره این پکیج دارید خوشحال میشم زیر این پست بخونم و یا به صورت issues داخل صفحه گیت هاب این پکیج ببینم.مرسی


برنامه نویسیلاراولبرنامه نویسدیتابیسeloquent
یه توسعه دهنده وب خصوصا back-end
شاید از این پست‌ها خوشتان بیاید