الدالة الجديدة withWhereHas عوضا عن with و whereHas

الدالة الجديدة withWhereHas عوضا عن with و whereHas

2024-05-19 وقت القراءه : 1 دقائق

في العديد من الأحيان نحتاج لجلب العلاقة بين جدولين بإستخدام with، بنفس الشرط التي تستخدم في whereHas، حيث نظطر لكتابة الشرط في الدالتين، إلا أنه في تم إضافة دالة جديده وهي withWhereHas حيث يمكن إستخدامها عوضاً عن إستخدام with و whereHas، مما يجعل الكود أسهل وأقل وأكثر قابلية للقراءة.

لفرض أن لدينا جدول من المستخدمين، وجدول للكتب، وهذه الكتب تنتمي لمستخدم معين، ونريد جلب المستخدمين الذين لديهم كتب فقط.

public function index(){
    $users=User::query()
        ->with('books:id,user_id,title')
        ->whereHas('books')
        ->get();
    return $users;
}

أما إذا أردنا جلب المستخدمين الذين لديهم كتب، وتكون حالة الكتاب status = 1

public function index(){
    $users=User::query()
        ->with(['books'=>function($q){
            $q->select('id','title','user_id')
                ->where('status',1);
        }])
        ->whereHas('books',function ($q){
            $q->where('status',1);
        })
        ->get();
    return $users;
}


كما نلاحظ أنه في الدالة الأعلى أنه تم إستخدام with وكذلك whereHas، وكذلك أيضاً تم تكرار الشرط في مرتين، أما بإستخدام withWhereHas فيمكننا تبسيط الدالة بالشكل التالي:

public function index(){
    $users=User::query()
        ->withWhereHas("books", function($q) {
            $q->select('id', 'user_id', 'title')
                ->where('status',1);
        })
        ->get();
    return $users;
}


ملاحظ: إذا كنت تهتم بالأداء وعدد الحقول كبيرة في قاعدة البيانات، يفضل إستخدام join عوضاً عن whereHas، ويمكن قراءة التفاصيل من هنا.


التعليقات
زائر
منذ سنة

بارك الله فيك وجزاك الله كل خير .. بستفاد جدا من المقالات استمر اتردد على الموقع من سنوات عديده وحبيت اترك تعليق جزاك الله كل خير وجعله في ميزان حسناتك اللهم امين

Eslam Gamal
منذ سنة

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

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