عنوان مقاله :

فیلتر کردن نتایج query ها با شروط مختلف

گردآوری و تالیف : حسام موسوی
تاریخ انتشار : 29 آبان 1394
دسته بندی ها : لاراول

شاید عنوان این مطلب برای شما کمی گیج کننده باشه ، اما بزارید براتون با یک مثال سادش کنم شما دارای لیستی از مشتری هستید و اونا رو با دستور Customer::all() نمایش میدید اما شما میخواین دو لیست جداگانه از مشتری های که در کشور انگلیس و کشور خودمون هستن رو به نمایش بزارید . خوب شما چطور این کار رو برای ساخت دو لیست جداگانه از یک دستور انجام میدید ؟ برای این کار یک تابع به نام filter() وجود داره.

در زیر مثالی برای درک بهتر filter میزنم ، بطور معمول شما اطلاعات مشتریهاتون رو بصورت زیر دریافت میکنید.

$customers = Customer::all();

پس از برگشت اطلاعات بصورت بالا شما با استفاده از یک function داخل filter() به راحتی میتونید شرط خودتون برای نمایش اطلاعات رو مشخص کنید. بصورت زیر 

$uk_customers = $customers->filter(function ($customer) {
    return $customer->country == 'United Kingdom';
});

حالا شما دارای یک مجموعه (collection) جدید داخل متغیر $uk_customers هستید ، اما متغیر قدیمی $customers هنوز بدونه تغییر باقی مونده و شما میتونید برای داشتن لیست بعدی ازش استفاده کنید . حالا در زیر فیلتر دیگه ای برای مشتری های که در کشور خودمون هستن با متغیر بدون تغییر $customers بوجود میاریم .

$ir_customers = $customers->filter(function ($customer) {
    return $customer->country == 'Iran';
});

خب ، حالا شما داری دو لیست جدا گانه در متغیر های $uk_customers و $ir_customers هستید و میتونید از هر کدوم بطور جداگانه و در جداول جداگانه استفاده کنید . 

همچنین  تابع دیگه ای به اسم reject() وجود داره که عملی برعکس کار تابع filter رو انجام میده . برای مثال شما میخواین همه مشتری هاتون بجز مشتری های کشور انگلیس رو داشته باشید باید از کد زیر استفاده کنید . 

$non_uk_customers = $customers->reject(function ($customer) {
    return $customer->country == 'United Kingdom';
});

امیدوارم براتون مفید بوده باشه 

مقالات پیشنهادی

تغییر نام لاراول Elixir به لاراول Mix

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

یه لقمه نون و لاراول

در این مقاله کوتاه میخواهم در مورد برخی از موضوعاتی در لاراول صحبت کنم که واقعا کسانی که خواهان کار با لاراول هستند باید این موارد را بدانند . بارها و...

تکرار کردن یک سطر در لاراول

امروز میخواهم در مورد ویژگی در لاراول صحبت کنم که به اصطلاح "hidden" است ، یعنی این قابلیت در سیستم لاراول وجود دارد اما در documentation لاراول چیزی...

فیلتر کردن نتایج query ها با شروط مختلف

شاید عنوان این مطلب برای شما کمی گیج کننده باشه ، اما بزارید براتون با یک مثال سادش کنم شما دارای لیستی از مشتری هستید و اونا رو با دستور Customer::al...

دیدگاه های ارزشمند شما

محمدرضاچاوشی پور | 8 ماه پیش

سلام خسته نباشید
ببخشید من از کد زیر استفاده میکنم:
$data_filter=Transaction::all();
$data = $data_filter->filter(function ($customer) use ($request){
return $customer->status == $request->status or $customer->card == $request->card or $customer->trackingcode == $request->trackingcode;

});
return view('admin.table',compact('data'));
سوال من اینه چجوری به صورت paginate برگردونم دیتا رو؟
ممنون
(در صفحه view ) با چی فراخوانی کنم؟

admin | 8 ماه پیش

در زیر گفتم روش استفاده چطوریه با توابع query builder ابتدا اطلاعات مورد نیاز رو برگردونید و بعد paginate کنید.

محمدرضاچاوشی پور | 8 ماه پیش

خسته نباشید
خب راه حل بهتری هم هست که انجام بدم؟
عذرمیخام دیگه ببخشید
ممنون میشم راهنمایی کنید

admin | 8 ماه پیش

باید بصورت مستقیم اطلاعات رو بگردونید و صفحه بندی کنید مثل کد زیر
Transaction::where()->paginate()
یا میتونید از کلاس paginate استفاده کنید و صفحه بندی خودتون رو ایجاد کنید که اینکار یک مقدار دشواره .

عاطفه کیان فر | 1 سال پیش

خیلی مهم بود. ممنون

mohammad | 1 سال پیش

ممنون از جوابتون .

ممنون میشم در این مورد یک ویدئو آموزشی قرار بدید تا من و امثال من بتونن ازش استفاده کنن :)

بخش نظرات سایتتون هم قشنگه :)
میشه آموزش ساختن بخش نظرات رو برای خبرها آموزش بدید ؟

طریقه ارتباطات بین جداول و ... منظورمه :)

متشکرم .

admin | 1 سال پیش

در دوره ها دارم این موارد رو آموزش میدم

mohammad | 1 سال پیش

ممنون از جوابتون :)

آقای موسوی ، سیستم سایت شما با لاراول نوشته شده ؟

یه سوالی دارم ، کمی بی ربط با موضوع هست :

من برای محصولاتم ، دسته و زیر دسته دارم
فرض کنید دسته ماشین با زیر دسته های شرکت های مختلف مثله : بز ، ولوو ، سایپا و ...
که هر کدوم از این زیر دسته ها ، برای خودشون زیر دسته دارن ، مثلا » سایپا > پراید > پراید 132

که تعداد زیر مجموعه ها در هر شاخه ممکنه بی نهایت باشه

یه مدل برای این دسته ها دارم و یک مدل برای محصولات هر دسته

1 - چطور میتونم تمام محصولات یک دسته رو همراه با زیر دسته هاش نمایش بدم ؟
2 - چطور میتونم درون تگ select ، هر سر دسته ( دسته ای که زیر دسته هیچ کدوم از دسته ها نباشه ) رو درون optiongroup قرار بدم و زیر دسته هاش رو option نمایش بدم ؟
یا اینکه دسته و زیر دسته هارو به یک شکل مشخصی نمایش بدم ؟


ممنون میشم راهنماییم کنید .

admin | 1 سال پیش

بله با لاراول نوشته شده

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

mohammad | 1 سال پیش

سلام جنبا موسوی ، وقت بخیر .

یه سوال برام بوجود اومده در همین مورد آموزشتون :

آیا متد country یک ارتباط به مدل دیگه ای هستش یا درون فیلد های جدول users قرار داره ؟

البته حدث میزنم که ارتباط باشه چون غیر از این جالت میشه از where استفاده کرد اما مشکل اینه که شما فقط خوده ارتباط رو صدا زدین و به فیلد درونش اشاره نکردید !

مثلا :
$customer->country->name

admin | 1 سال پیش

اگه به کد اولی نگاه کنید میبینید که من یک مدل رو فراخونی کردم و اطلاعات اون مدل رو گرفتم داخل متغییر customer ریختم
که همونطور حدث زدین ارتباط مدله البته میتونه Collections باشه که خودتون اضافه میکنید .
فیلد های داخل customer مهم نبود ما فرض کردیم که چنین مدلی وجود داره و چنین فیلد های داره که نمایش دادیم

حسین | 1 سال پیش

ممنون از زحماتی که می کشین

admin | 1 سال پیش

خواهش میکنم