في قصاصة برمجية سابقة تحدثنا عن الدالة الرائعة withCount والتي تساعدنا في معرفة عدد الحقول الأبناء، على سبيل المثال لو كان لدي جدول للمدارس schools وأريد أن أجلب جميع المدارس مع عدد الطلاب.
لفرض لدينا الجدول التالي
1- تحديد العلاقة بين جدولي Schools و Students ، ففي School Model نحدد العلاقة وهي HasMany لأن المدرسة تحتوي على أكثر من طالب
public function students(){ return $this->hasMany(Student::class); }
2- في School Controller بداخل الدالة index مثلا، نقوم بكتابة جملة eloquent لجلب المدارس مع إستخدام الدالة withCount لجلب عدد الطلاب في كل مدرسة
public function index(){ $schools = School::Select('name')->withCount('students')->get(); return view('students',compact('schools')); }
3- في العرض اي ملف blade نقوم بكتابة foreach للـ $schools array لطباعة النتائج مع
@foreach($schools as $school) <tr> <td>{{ $school->name }}</td> <td>{{ $school->students_count }}</td> </tr> @endforeach
بالتالي نحصل على الجدول التالي
لكن السؤال! كيف يمكن إستخدام الشرط مع withCount بمعنى إننا نريد أن يتم جلب المدرسه مع عدد الطلاب الذكور وعدد الطلاب الإناث
هنا يمكن لنا إستخدام callback function حيث يمكن تمرير $query كـ parameter ومن ثم كتابة الشرط
public function index(){ $schools = School::select('name')->withCount(['students as male_students' => function($query) { $query->where('gender', 1); },'students as female_students'=>function($query){ $query->where('gender', 0); }])->get(); return view('students',compact('schools')); }
وفي ملف blade نستخدم alias name الذي قمنا بتحديده في جملة eloquent
@foreach($schools as $school) <tr> <td>{{ $school->name }}</td> <td>{{ $school->male_students }}</td> <td>{{ $school->female_students }}</td> </tr> @endforeach
فنحصل على الجدول التالي
كما يمكن لنا أيضا إختصار الكود أعلاه من خلال تحميل الجمل الشرطية في الـ model
في School Model
class School extends Model { use HasFactory; public function students_male(){ return $this->hasMany(Student::class)->where('gender',1); } public function students_female(){ return $this->hasMany(Student::class)->where('gender',0); } }
وفي جملة eloquent
public function index(){ $schools = School::select('name')->withCount('students_male','students_female')->get(); return view('students',compact('schools')); }
وفي العرض
@foreach($schools as $school) <tr> <td>{{ $school->name }}</td> <td>{{ $school->students_male_count }}</td> <td>{{ $school->students_female_count }}</td> </tr> @endforeach
جزاك الله كل خير وجعله في ميزان حسناتك اللهم امين
جزاك الله خيرا
مقال غني بالمعلومات
Ahmad
جزاكم الله خير هل هذه الخاصية مشابهة لعمل دالة ال sum في eloquent ?