رافق مجتهدزاده
2 سال پیش توسط رافق مجتهدزاده مطرح شد
9 پاسخ

کوئری دریافت تعداد دانش آموزان یک دبیر

سلام
من یه جدول دبیران دارم. یک جدول دوره های تحصیلی دارم. هر دبیر با دوره تحصیلی رابطه یک به چند داره (یعنی هر دوره متعلق به یک دبیره. ولی هر دبیر می تونه چند دوره برگزار کنه) رابطه اش رو هم توی لاراول ایجاد کردم.
یه جدول دانش آموزان هم دارم که با جدول دوره ها رابطه چند به چند داره. (هر دانش آموز می تونه تو چند دوره شرکت کنه و هر دوره می تونه شامل چند دانش آموز بشه) . طبق استانداردهای لاراول جدول واسط و رابطه رو هم توی مدل نوشتم.
حالا می خوام تو "کنترلر دبیر" ببینم یک دبیر چند تا دانش آموز داره؟ (تعدادشون) و در صورت امکان لیست دانش آموزانش رو هم به دست بیارم.
چطور می تونم این کار رو انجام بدم؟
مدل دبیر:

public function course(){
        return $this->hasMany(course::class);
    }

مدل دوره:

 public function teacher(){
        return $this->belongsTo(Teacher::class);
    }
public function students(){
        return $this->belongsToMany(Student::class)->withPivot('start_date','cancel_date','status');
    }

مدل دانش آموز:

public function courses(){
        return $this->belongsToMany(course::class)->withPivot('status','start_date','cancel_date');
    }

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


ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
2

سلام باید از این رابطه استفاده کنی Has Many Through


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

@hosseinshirinegad98 یعنی باید توی مدل رابطه ام رو عوض کنم؟
این روابط رو من بر اساس آموزش های لاراول نوشتم. الان Has Many Through رو هم می خونم.
البته با کد زیر تونستم تعداد رو بگیرم. ولی فکر می کنم باید روش استانداردتری هم باشه.

public function show(Teacher $teacher)
    {
 $teacher_courses =  $teacher->course()->get();
        $sumCountOfStudent = 0;
        foreach ($teacher_courses as $course){
            $sumCountOfStudent += $course->students()->count();
        }
dd(sumCountOfStudent )
 }

رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

@hosseinshirinegad98 من مطلب ارسالی شما رو مطالعه کردم و رابطه نوع Has Many Through رو پیاده کردم. اما ظاهرا این رابطه مشکل من رو حل نمی کنه. البته شاید تنظیماتی داره که من بلد نشدم.

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'students.course_id' in 'on clause' 

تو خطا می گه که توی جدول student کلید course_id وجود نداره. من اسامی رو استاندارد انتخاب کردم ولی این کلید رو نخواهم داشت. چرا که رابطه ی بین student و course چند به چنده و از جدول واسط استفاده می کنه. ظاهرا این رابطه برای مواردی هست که سه مدلی که به صورت زنجیری به هم متصل هستند بین هر دو تاشون رابطه یک به چند وجود داشته باشه. نه چند به چند.
مگر اینکه بشه همین رابطه رو برای چند به چند هم تعریف کرد.
با این حال باز هم ازتون ممنونم. این رو هم یاد گرفتم. حتما جاهای دیگه به دردم می خوره


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
1

ببینید شما تمام اون روابط قبلی که تعریف کردیدو باید داشته باشید و نباید هیج کدومشونو حذف کنید فقط این رابطه رو هم به مدل اضافه میکنید و کارش فقط اینه که از مدل اول به راحتی میشه به سطرهای مدل سوم دسترسی داشت.همین


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

@hosseinshirinegad98 دقیقا همین کار رو کردم.
ولی خطایی رو داد که خدمتتون ارسال کردم


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
1

توی روابط many to many احتمالا این روش جواب نده ولی برای روش one to many بهترین روش برای دسترسی از مدل اول به سوم همین رابطست.
مثال فرض کن یه کشور تعدادی استان داره و هر استان تعدای شهر داره اینجا میشه از این رابطه استفاده کرد
و اما برای راه حل شما
میتونید از یه رابطه چند به چند بین دبیران و دانش اموزان استفاده کنید


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

این رابطه ای که شما @hosseinshirinegad98 معرفی کردید توی موارد دیگه خیلی کارم رو راه خواهد انداخت.
ولی ایجاد رابطه جدید بین دانش آموز و دبیر با توجه به اینکه از طریق دوره رابطه دارند به نظرم افزونگی ایجاد می کنه.
البته همونطور که تو پست قبلی گفتم با یکم کد اضافی تعداد دانش آموزان رو گرفتم.
اول اومدم با رابطه بین معلم و دوره، تمام دوره های دبیر رو گرفتم. بعد توی یه حلقه هر دوره رو بررسی کردم و تعداد دانش آموزان هر دوره رو با رابطه ای که بین دوره و دانش آموز بود دریافت کردم و همه رو جمع زدم.
این کارم رو راه انداخت. برام بد هم نشد. چون یه سری اطلاعات دیگه رو هم از جمله مجموع پرداختی تمام دوره ها و ... رو هم می خواستم که از توی همین حلقه درش آوردم.
ولی تصورم این بود که یه راه ساده تر هم باشه که تا این لحظه پیدا نکردم. توی stackoverflow هم تو لینک زیر درج مشکل کردم. فعلا اونجا هم راه حلی ندادند:
لینک مشکل

ولی حالا هم دنبال این هستم که ببینم می تونم علاوه بر تعداد دانش آموزان، تعداد دانش آموزان منحصر به فرد رو هم پیدا کنم؟
چون یه دانش آموز ممکنه تو دو تا دوره از یک دبیر شرکت کنه. اینطوری که من محاسبه کردم دومرتبه شمرده می شه! شاید بتونم منحصر بفردهاش رو هم پیدا کنم.
اگر هر موردی رو پیدا کردم اینجا درج می کنم


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
0

برای منحصر به فرد بودن میتونید موارد تکراری رو حذف کنید از متدunique توی کالکشنها میشه استفاده کرد


یونس عبداحد
تخصص : طراح سایت
@YounesAbdeahad 2 سال پیش مطرح شد
-1

دوست عزیز برای اینطور روابط حتما حتما از polymorphic ها استفاده کنید که با یک جدول اضافه میتونه کامل دسترسی بده بهتون میتونید بخش polymorphic many to many استفاده کنید یا از همین has many through
حتما نگاهی به داکیومنت بندازید و سرچ کنید این روش ها رو به جواب مورد نظر میرسید.


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

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