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

انتشار نسخه جدید Eloquent Filter

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

https://virgool.io/d/navqdn31tpx9/%F0%9F%93%B7Jenga
Eloquent Filter
Eloquent Filter


پشتیبانی از شرط های Nested Relation Model

در ورژن ۲ به بعد شما میتونید فیلتر ها روی netsed model ها رو هم داشته باشید که خیلی کاربردی هست.فقط باید whitelist رو ست کنید. همچنین پارامتر ها در url به این صورت ست شود.

https://gist.github.com/mehdi-fathi/748387470f113e987325fadc6570eae4
http://localhost:8000/users/list?posts[count_post]=876&username=mehdi

select * from "users" where exists (select * from "posts" where "posts"."user_id" = "users"."id" and "posts"."count_post" = 876) and "username" = "mehdi"

ساخت Custom Detection Condition

گاهی اوقات شما نیاز دارید که یکسری شرایط برای ساخت یک کوعری بخصوص داشته باشید که پکیج Eloquent Filter به صورت پیشفرض نمیتونه اون رو ساپورت کنه. که شما میتونید با استفاده از متد Custom query filter این مشکل رو حل کنید ولی یه راه حل بهتری هم هست که میتونید با استفاده از Custom Detection Condition یکسری شرایط رو بررسی کنید و اون کوعری خودتون رو به اصطلاح inject کنید. به همین راحتی

/users/list?username[value]=mehdi&username[limit]=10&username[email]=mehdifathi&username[like_relation_value]=mehdi&count_posts=10

select * from "users"
where exists (select * from "posts" where
"users"."post_id" = "posts"."id"
and "comment" like ?) and "username" <> ? and "email" like ? and "count_posts" = ? limit 10
https://gist.github.com/mehdi-fathi/5e6d83fe93521b6cc6d9cf97fe53ea43



ابتدا باید یه کلاس برای شناسایی شرایط مورد نظر بسازید مثه کد بالا.بعد میتونید کوعری دلخواه خودتون رو با یه کلاس دیگه تکمیل کنید.



https://gist.github.com/mehdi-fathi/6f848700881ce005b7f14dcd6124c58a



تمام پارامتر ها اول بصورت در کلاس WhereRelationLikeConditionQuery چک می شود و سپس توسط شرط های پیش فرض eloquent filter بررسی می شود.

با کد زیر شما میتونید کلاس مورد نظر رو inject کنید به صورت on the fly

$users = User::SetCustomDetection([WhereRelationLikeCondition::class])->filter();

شما میتونید به صورت پیشفرض با ساخت متد EloquentFilterCustomeDetection هم کلاس مورد نظر رو inject کنید.به این صورت به صورت خودکار تو تمام فیلتر های اون مدل اون شرایط مورد نظر اعمال میشه.

class User extends Model { use Filterable; public function EloquentFilterCustomDetection(): array { return [ WhereRelationLikeCondition::class, ]; } }

معرفی Magic Methods

گاهی اوقات شما نیاز به یسری امکانات دارید که خیلی از کارهای تکراری قبل از فیلتر کوعری انجام بشه و یا حتی بعد از فیلتر. مثلا نیاز دارید قبل از فیلتر تاریخ میلادی رو به شمسی تبدیل کنید و یا داده رو تغییر بدید قبل از فیلتر شاید لازم باشه دیتا بعد از فیلتر تو ردیس کش بشه و یا جایی برای شما یه لاگ بخصوص بزاره.در حال حاضر Eloquent Filter دو تا متد wrapper برای این قبیل موارد داره که میتونه بهتون کمک کنه.

متد serialiazeRequestFilter

این متد یه wrapper برای ورودی های به eloquent filter هست. که برای استفاده از اون باید این متد داخل مدل شما تعریف بشه.

https://gist.github.com/mehdi-fathi/7ae88281a87cc13882f6b8828b284b61

متد ResponseFilter

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

https://gist.github.com/mehdi-fathi/26a7ba5426833ebcbafa69b866a7a64c





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

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