شو هو مفهوم الـ Eager Loading ؟

٣٠ سبتمبر ٢٠٢٤

بشكل عام هو مفهوم متعارف عليه في عالم الـ database management او في عالم الORM systems، وهو إنّي أحمّل الrelated data بنفس الquery الي بطلبها ( يعني تكون جزأ منها )، وهادا عكس مفهوم ال Lazy loading الي معناه انه اجيب الداتا حسب الحاجة.مثال:نفترض إنه عنا جدولين في الداتابيز ( users, posts ) وكل user اله أكتر من post, تخيل إني بدي أجيب الـ user و المنشورات تعته، في حالة إني ما أستخدم الـ eager loading هذا معناه انه عدد الـ queries الي حيتم طلبها من الـ database هو query عشان أجيب الuser و N queries وهنا N هو حسب عدد من منشورات المستخدم الي ممكن يكون عدد كبير. ( وهذا ما يسمّي ب N+1 query problem ) ولكن في حال استخدام مفهوم الـ eager loading هنا عدد الـ queries هو 1 فقط، وهو اني بجيب المستخدم وبتكون منشوراته متحمّله في نفس الـ response.

ليش الـ Eager Loading مفيدة؟

الـ Eager loading بتحسّن الـ performance بشكل رهيب من خلال:

  1. تقليل عدد ال query عشان اجيب بيانات معيّنة.
  2. بقلل الحمل على الداتابيز خصوصا لو كان عندي أكثر من relation.
  3. بتجنب مشكلة N+1 query.

كيف بستخدم الـ Eager Loading في الـ Laravel؟

في الـ Laravel، الـ eager loading معموللها implement عن طريق ميثود ()with، وهيك بتحمّل الـrelations بجانب الmain model query، تابع الصورة رقم 1.

في حال كان عندي complex relations كيف بقدر اتعامل مع الـ Eager Loading في الـ Laravel؟

  • الـ Laravel بتدعم الـ eager loading لو كان عندي nested relations زي مهو موضّح في الصورة رقم 2.

  • ولو كان عندي شروط معينة على الـ relation لما تتحمّل برضو بنقدر ننفّذها زي م هو موضّح في صورة رقم 3.

طيب لو انا دايما بدي الـ relations تتحمل مع الـ model بدون ما أغلّب حالي واضلني استخدم with في كل مكان، في هاي الحالة بعرّف الـ with داخل الـ model نفسه زي صورة رقم 4.

متى لازم أستخدم الـ Eager Loading؟

  1. لما نكون متأكدين انه الـ related relations لازم اطلبها مع الـ main query.
  2. في حال بدي أتجنّب مشاكل الـ performance المتعلّقة في multiple queries.
  3. لما نكون بنتعامل مع models فيها relations كتيرة وبدنا نتأكد انه دايما الداتا بتتحمل بكفاءة فيها.

باختصار:

الـ Eager Loading هي تقنية لتحسين الأداء بتساعدك تجيب البيانات المرتبطة بـ model معين في query واحدة بدل ما تنفذ queries منفصلة لكل جزء من البيانات.

وبتكون مفيدة جداً في تقليل مشكلة الـ N+1، اللي فيها بيتم تنفيذ queries كتيرة لكل جزء من البيانات مرتبطة.

في Laravel، الـ Eager Loading بتتطبق عن طريق استخدام دالة ()with، وبتسمح للمبرمجين يحملوا العلاقات بين البيانات بشكل فعّال، وهادا مش بس بيحسّن الأداء، كمان بيضمن إن البيانات المرتبطة جاهزة على طول من غير ما تعمل queries إضافية بعدين.

كمان، Laravel بيدعم الـ Eager Loading للعلاقات المتداخلة والشرطية، وهادا بيدي المبرمجين مرونة أكبر في التعامل مع العلاقات المعقدة.