این روزا نسخه جدید Eloquent Filter منتشر شده که بسیاری امکانات جدید در اختیار کاربران فریم ورک لاراول قرار داده که میتونه خیلی بهشون کمک کنه.Eloquent Filter یک پکیج هست واسه ساخت کوعری ها ساده و پیچیده با استفاده از پارامتر های ارسالی کاربر.ساخت صفحات گزارش گیری همراه با فیلتر های گوناگون با استفاده از این پکیج راحت تر و سریع تر انجام میشود.اگر دوست دارید توضیحات بیشتری بخونید میتونید این لینک رو اول یه نگاهی بندازید و یا صفحه گیت هاب این پکیج رو یه نگاه بندازید. تو این مطلب قصد داریم جدیدترین امکانات این پکیج رو معرفی کنیم.
در ورژن ۲ به بعد شما میتونید فیلتر ها روی netsed model ها رو هم داشته باشید که خیلی کاربردی هست.فقط باید whitelist رو ست کنید. همچنین پارامتر ها در url به این صورت ست شود.
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"
گاهی اوقات شما نیاز دارید که یکسری شرایط برای ساخت یک کوعری بخصوص داشته باشید که پکیج 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
ابتدا باید یه کلاس برای شناسایی شرایط مورد نظر بسازید مثه کد بالا.بعد میتونید کوعری دلخواه خودتون رو با یه کلاس دیگه تکمیل کنید.
تمام پارامتر ها اول بصورت در کلاس 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, ]; } }
گاهی اوقات شما نیاز به یسری امکانات دارید که خیلی از کارهای تکراری قبل از فیلتر کوعری انجام بشه و یا حتی بعد از فیلتر. مثلا نیاز دارید قبل از فیلتر تاریخ میلادی رو به شمسی تبدیل کنید و یا داده رو تغییر بدید قبل از فیلتر شاید لازم باشه دیتا بعد از فیلتر تو ردیس کش بشه و یا جایی برای شما یه لاگ بخصوص بزاره.در حال حاضر Eloquent Filter دو تا متد wrapper برای این قبیل موارد داره که میتونه بهتون کمک کنه.
این متد یه wrapper برای ورودی های به eloquent filter هست. که برای استفاده از اون باید این متد داخل مدل شما تعریف بشه.
این متد برای خروجی کوعری ها بعد از فیلتر هست.شما میتونید عملیات مورد نظر خودتون رو بعد از فیلترینگ انجام دهید. که با تعریف این متد داخل مدل خودتون میتونید از اون استفاده کنید.
اگر نظر یا ایده ای درباره این پکیج دارید خوشحال میشم زیر این پست بخونم و یا به صورت issues داخل صفحه گیت هاب این پکیج ببینم.مرسی