تكرار السؤال: …
الإجابة المختصرة
باستخدام دالة upsert() التي تقبل مصفوفة البيانات، وقائمة الأعمدة التي تحدد التفرد، وقائمة الأعمدة المراد تحديثها عند وجود تعارض.
الشرح
بدلاً من تنفيذ فحص updateOrCreate لكل سجل على حدة في حلقة تكرارية (مما يولد مئات الاستعلامات)، تترجم دالة upsert إلى استعلام SQL واحد متقدم (INSERT ... ON DUPLICATE KEY UPDATE في MySQL أو ON CONFLICT DO UPDATE في PostgreSQL)، مما يوفر أداءً فائق السرعة للمعاملات الدفعية.
مثال بالكود
User::upsert([
['email' => '[email protected]', 'name' => 'Ali', 'points' => 10],
['email' => '[email protected]', 'name' => 'Sara', 'points' => 20],
], ['email'], ['name', 'points']);أخطاء شائعة
- استخدام updateOrCreate داخل حلقة لملايين السجلات متسببين في بطء هائل وإجهاد لقاعدة البيانات.