تا حالا تجربه ساخت صفحات گزارش گیری ادمین یا ساخت صفحات با فیلتر های جستجوی متعدد در لاراول داشتید؟اگر پیاده سازی این قبیل امکانات را تجربه کردید.قطعا میدونید که ساخت این قبیل صفحات نیازمند دریافت یکسری داده از کاربر و ساخت کوعری بر اساس اون داده ها هست.امروز پکیج Eloquent filter رو معرفی میکنم که این مشکل رو خیلی راحت حل میکنه و دیگه نیازی نیست درگیر پیچیدگی های کوعری های صفحات فیلتر بشید و حتی نیازی نیست خیلی از کوعری ها رو خودتون بزنید و کوعری ها با استفاده از پارامتر های query string ساخته می شوند.فکر میکنم با مثال بهتر منظور خودم رو برسونم.
اولین راه حلی که به ذهن اکثر توسعه دهنده ها میرسه اینه که برای هر داده ورودی یک نوع کوعری بسازیم.خب این مشکل با این راه حل حل میشه ولی قطعا در آینده کدهایی خواهید داشت که ده ها دستور شرطی برای هر نوع فیلد دارند.که قطعا پیچیدگی زیادی به کد شما وارد می کند و همچنین خوانایی کد شما کاهش می یابد.به طور مثال این نوع url را ببینید:
http://localhost:8000/users/search?age_more_than=25&gender=male&created_at=25-09-2019
کد بالا نحوه پیاده سازی در روش قدیمی هست همانطور که می بینید برای هر نوع دیتا یک دستور شرطی درست شده است. البته شاید بشه حالا فرض کنید در اینده فیلتر شما کمی پیشرفته تر شود اون موقع نگهداری و پیاده سازی امکانات جدید یه مقدار پیچیده و سخت خواهد شد.
تصور کنید شما یک پکیج نصب کنید که با استفاه از یسری قواعد query string شما رو تبدیل به یسری از شرط های mysql کند و کلا پیچیدگی پیاده سازی این قبیل امکانات رو بر عهده بگیره در ضمن حتی برخی کوعری ها را با توجه به پارامتر های ورودی بسازه. شما فقط دیتاهای مورد نظر رو به صورت query string به Controller خودتون تو فریم ورک لاراول پاس دهید همین!.قطعا این پکیج میتونه سرعت و تمیزی کد شما رو بالاتر ببره.
به تازگی ورژن جدید eloquent filter منتشر شده همراه با ویژگی های بسیار کاربردی که میتونید از لینک گیت هاب جدیدترین نسخه آن که ورژن ۲ این پکیج هست را نصب و استفاده کنید.برای دریافت نسخه جدید این لینک را کلیک کنید.
اول با استفاده از composer پکیج را نصب میکنیم.
$ composer require mehdi-fathi/eloquent-filter:1.6.9
طبق کد زیر باید Filterable trait را به مدل خودتون اضافه کنید.همچنین فیلد های که میخواهید در فیلتر استفاده کنید باید در whiteListFilter مقدار دهی کنید.
با این مقدار دهی میتوانید همه ی فیلد ها را برای فیلتر باز بگذارید.
private static $whiteListFilter = ['*'];
به همین سادگی حالا فقط کافیه داده ها از سمت 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 داخل صفحه گیت هاب این پکیج ببینم.مرسی