دسته بندی :
تاریخ انتشار : ۲۹ آبان ۱۳۹۴
گردآوری و تالیف : حسام موسوی

کارمو با طراحی گرافیکی شروع کردم و حدود 2 سال طراحی گرافیکی میکردم بعد به طراحی وب علاقه پیدا کردم و همراه طراحی وب عاشق کدنویسی شدم به PHP | sass | css | Jquery | javaScript تسلط کامل دارم . در بین فریم ورک های PHP اول با CodeIgniter کار کردم اما به laravel علاقه مند شدم و دارم بطور حرفه ای دنبالش میکنم . امید من اینکه بتونم کاربرهای ایرانی رو به دنیای بیرون متصل کنم تا بتونن از فناوری های تازه آگاهی داشته باشن

شاید عنوان این مطلب برای شما کمی گیج کننده باشه ، اما بزارید براتون با یک مثال سادش کنم شما دارای لیستی از مشتری هستید و اونا رو با دستور 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';
});

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

دیدگاه های مخاطبین

ثبت دیدگاه شما
  • محمدرضاچاوشی پور

    سلام خسته نباشید
    ببخشید من از کد زیر استفاده میکنم:
    $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

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

    • محمدرضاچاوشی پور

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

    • admin

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

  • عاطفه کیان فر

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

  • mohammad

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

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

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

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

    متشکرم .

    • admin

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

  • mohammad

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

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

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

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

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

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

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


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

    • admin

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

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

  • mohammad

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

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

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

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

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

    • admin

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

  • حسین

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

    • admin

      خواهش میکنم

پیشنهاد میکنیم این مطالب رو هم مطالعه کنید :