نوب
1 سال پیش توسط نوب مطرح شد
2 پاسخ

نمایش کاربران خواهر و برادردر لاراول

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

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

مثلا
علی صمیمی و سارا صمیمی - شماره پدر 09124445555
محمد عباسی و علی عباسی - شماره پدر 09162225555

میشه کمک کنین :)

$users = user_profile::with('user')
            ->whereNotNull('father_mobile')
            ->groupBy('father_mobile')->havingRaw('count(*) > 1')
            ->get();

ثبت پرسش جدید
مهدی مشایخی
تخصص : برنامه نویس پایتون - ماشین لرن...
@MahdiMashayekhi 1 سال پیش مطرح شد
0

سلام
میتونید از self join برای پیداکردن افرادی که با هم نسبت فامیلی دارند استفاده کنید

$users = DB::table('users AS u1')
           ->join('users AS u2', function ($join) {
               $join->on('u1.father_mobile', '=', 'u2.father_mobile')
                    ->orWhere('u1.mother_mobile', '=', 'u2.mother_mobile');
           })
           ->select('u1.id', 'u1.name', 'u1.father_mobile', 'u1.mother_mobile', 'u2.id AS sibling_id', 'u2.name AS sibling_name')
           ->where('u1.id', '<', 'u2.id') // to avoid duplicate matches
           ->groupBy('u1.id')
           ->get();

محمد شریف احمدی
تخصص : یک عدد برنامه نویس
@mrahmadi 1 سال پیش مطرح شد
0

برای این کار می‌توانید از دو کوئری و یک آرایه استفاده کنید و سپس آرایه را به ازای هر خانواده خاص داخل یک کالکشن جدید بگذارید. برای این کار بهتر است از روش collection در Laravel استفاده کنید.

پس از دریافت اطلاعات از دیتابیس و ذخیره آنها در آرایه، شما می‌توانید با استفاده از collection و دستورات groupBy() و map() به هر ازای یک خانواده‌ی خاص که بر اساس شماره همراه پدر تشکیل شده است، یک کالکشن جدید ایجاد کنید.

برای مثال، اگر بر اساس شماره همراه پدر دو خانواده در دیتابیس داشته باشیم، می‌توانیم با دستورات زیر ابتدا یک آرایه از تمامی اعضای خانواده‌ها دریافت کنیم:

$allUsers = UserProfile::whereIn('father_mobile', function ($query) {
       $query->select('father_mobile')
          ->from('user_profiles')
          ->groupBy('father_mobile')
          ->havingRaw('count(*) > 1');
      })
      ->orWhereIn('mother_mobile', function ($query) {
        $query->select('mother_mobile')
          ->from('user_profiles')
          ->groupBy('mother_mobile')
          ->havingRaw('count(*) > 1');
      })
      ->get();

اگر شما به شکل فوق orWhereIn() را به کوئری اضافه کنید، تمامی اعضای خانواده‌ها با شماره موبایل مادر نامتعلق به دیتابیس، نیز برگشت داده می‌شوند.

پس از گرفتن این آرایه، می‌توانید آن را با استفاده از collection به آرایه‌های کوچکتر تبدیل کنید که هر کدام نشان‌دهنده یک خانواده از کاربران خاصی هستند. برای مثال، اگر ۳ کاربر در دیتابیس دارای یک شماره همراه پدر باشند، آنها به راحتی در یک آرایه با collection گروه‌بندی می‌شوند.

$usersByFamily = $allUsers->groupBy('father_mobile');

حالا شما می‌توانید داده‌ها را در فرمتی که پسندیده‌اید نمایش دهید. به طور مثال، می‌توانید از foreach برای گرفتن هر خانواده، کل اعضا را در یک جدول نمایش دهید:

@foreach($usersByFamily as $family)
  <h2>Family with father mobile {{ $family->first()->father_mobile }}</h2>
  <table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Mobile</th>
      </tr>
    </thead>
    <tbody>
      @foreach($family as $member)
      <tr>
        <td>{{ $member->user->name }}</td>
        <td>{{ $member->user->mobile }}</td>
      </tr>
      @endforeach
    </tbody>
  </table>
@endforeach

این کد SQLی که به شما کمک کرده است تمام کاربرانی که یا مادر و یا پدر دارای شماره موبایل تکراری می‌باشند، باز می‌گرداند. برای آنکه فقط کاربرانی که هر دوشان از شماره موبایل یکسانی برای یکی از پدر و مادری استفاده می‌کنند فیلتر شوند، بهتر است دستور SELECT را روی جدول user_profiles دوبار اضافه کرده و در دو دستور where مجزا برای پدر و ‌مادر از آن استفاده کنید. برای مثال:

$allUsers = UserProfile::whereIn('father_mobile', function ($query) {
         $query->select('father_mobile')
             ->from('user_profiles')
             ->groupBy('father_mobile')
             ->havingRaw('count(*) > 1');
        })
       ->whereIn('father_mobile', function ($query) {
         $query->select('father_mobile')
             ->from('user_profiles')
             ->groupBy('father_mobile')
             ->havingRaw('count(*) > 1');
        })
       ->orWhereIn('mother_mobile', function ($query) {
         $query->select('mother_mobile')
             ->from('user_profiles')
             ->groupBy('mother_mobile')
             ->havingRaw('count(*) > 1');
        })
       ->orWhereIn('mother_mobile', function ($query) {
         $query->select('mother_mobile')
             ->from('user_profiles')
             ->groupBy('mother_mobile')
             ->havingRaw('count(*) > 1');
        })
       ->get();

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام