x32x01
  • بواسطة x32x01 ||
من أسوأ الأشياء التي قد تستخدمها داخل تطبيق لارافيل هي دالة whereHas بشكل متداخل , لأنها تضرب الأداء بشكل سيئ جداً (عن تجربة) .
استخدام دالة whereHas مفيد ومافيه أي مشكلة , ولكن إستخدام whereHas بشكل متداخل يسبب مشاكل في الأداء خاصة إذا كانت البيانات كبيرة .
نأخذ مثال :-
المثال التالي سيئ (حيث تم استخدامها بشكل متداخل)
PHP:
Subscription::whereHas('features', function ($query) {
    $query->whereHas('prices', function ($query) {
        $query->where('amount', '>', 100);
    });
})->get();

لماذا هذا الاستعلام سيئ ويسبب مشاكل في الأداء ؟
الجواب :-
- تكرار الاستعلامات الفرعية: يتم تنفيذ استعلام فرعي لكل سجل يتم معالجته، مما يؤدي إلى آلاف الاستعلامات الإضافية إذا كانت البيانات ضخمة.
- يقوم بمسح كامل للجدول Full Table Scan لجدول prices يعني قراءة كل صف في الجدول حتى يتم العثور على السجلات المطابقة، مما يؤدي إلى أداء سيئ مع الجداول الكبيرة.

كيف نعالجها .؟
استخدام العلاقات المترابطة بدلاً من التداخل
PHP:
- Subscription::whereHas('features.prices', function ($query) {
    $query->where('amount', '>', 100);
})->get();

استخدام with لتحميل العلاقات مسبقًا
PHP:
Subscription::with(['features.prices' => function ($query) {
    $query->where('amount', '>', 100);
}])->get();
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
243
x32x01
x32x01
x32x01
الردود
0
المشاهدات
478
x32x01
x32x01
x32x01
الردود
0
المشاهدات
236
x32x01
x32x01
x32x01
الردود
0
المشاهدات
250
x32x01
x32x01
x32x01
الردود
0
المشاهدات
235
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
1,738
المشاركات
1,948
أعضاء أكتب كود
373
أخر عضو
zezo
عودة
أعلى