تكرار السؤال: …
الإجابة المختصرة
تضيف عمود deleted_at وتستبعد السجلات المحذوفة تلقائياً بـ Global Scope؛ ويجب تضمين deleted_at في الفهارس المركبة للحفاظ على سرعة الاستعلامات.
الشرح
عند استخدام SoftDeletes، لا يتم حذف الصف من القرص بل يُسجل وقت الحذف في deleted_at. يقوم Eloquent تلقائياً بحقن WHERE deleted_at IS NULL في كل استعلام. في الجداول المليونية، إذا كانت فهارسك لا تتضمن عمود deleted_at، ستتدهور كفاءة الفهارس وقد تجبر المحرك على فحص كامل للجدول (Full Table Scan).
مثال بالكود
// استخدام الحذف اللين
use SoftDeletes;
// استعادة المحذوفات
User::withTrashed()->where('id', 1)->restore();أخطاء شائعة
- عدم مراعاة قيد التفرد (Unique Constraint) مع الحذف اللين، حيث يفشل إنشاء مستخدم بنفس البريد إذا كان هناك مستخدم سابق محذوف ليناً ما لم يُدمج deleted_at في القيد.
أسئلة متابعة
- ما الفرق بين Local Scopes و Global Scopes في نماذج Eloquent وكيف تطبق كلاً منهما؟
- ما هي أحداث النماذج (Eloquent Events) وما دور الـ Observers في تنظيم منطق الأعمال؟