كيفية إستخدام الشروط مع withCount في لارافيل

كيفية إستخدام الشروط مع withCount في لارافيل

2024-09-05 وقت القراءه : 2 دقائق

في قصاصة برمجية سابقة تحدثنا عن الدالة الرائعة 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 ?

زائر
منذ سنة

جزاك الله كل خير وجعله في ميزان حسناتك اللهم امين

Eslam Gamal
منذ سنة

جزاك الله خيرا

tohami
منذ سنة

مقال غني بالمعلومات

إضافة تعليق
Loading...