اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

هنا مثال يوضح الفرق بين استخدام `with` و `load` في لارفل:

// استخدام with
$users = User::with('comments')->get();
// هذا يحمل جميع المستخدمين وتعليقاتهم في استعلام واحد

// استخدام load
$users = User::all();
// هذا يحمل جميع المستخدمين في الاستعلام الأول

$users = $users->load('comments');
// هذا يحمل تعليقات المستخدمين في الاستعلام الثاني

في المثال أعلاه، يتم استخدام `with` لتحميل جميع المستخدمين وتعليقاتهم في استعلامين فقط. بالمقابل، يتم استخدام `load` لتحميل المستخدمين أولاً، ثم تحميل تعليقاتهم في وقت لاحق.

و لقد تم الاجابة على سؤالك سابقاً هنا :

  • 0
نشر

كلاً من load و with هما وظيفتان تستخدمان في التعامل مع العلاقات بين النماذج (Models) في قاعدة البيانات.

1- load

تُستخدم لتحميل العلاقات المرتبطة (Eager Loading) مع نموذج محدد، وعندما تقوم بتحميل العلاقات، يتم استعادة البيانات المرتبطة مسبقًا من قاعدة البيانات وتعيينها مع النموذج الأصلي.

مثلاً، لنفترض أن لدينا نموذجين User و Post، وبينهما علاقة "المستخدم لديه العديد من المنشورات" (User has many posts)، واستخدام load لتحميل المنشورات المرتبطة بمستخدم معين عند الحاجة.

إليك مثالًا:

$user = User::find(1);
$user->load('posts');

وفيه يتم تحميل المنشورات المرتبطة بالمستخدم ذو الهوية 1 من قاعدة البيانات وتخزينها في النموذج.

2- with

تُستخدم لتحميل العلاقات المرتبطة (Eager Loading) مع الاستعلام الأساسي، وتساعد في تقليل عدد استعلامات قاعدة البيانات المنفصلة التي يتم إجراؤها عند الوصول إلى العلاقات.

بمعنى إذا كنت تريد استرداد قائمة المستخدمين مع منشوراتهم، تستطيع استخدام with لتحميل العلاقة في نفس الاستعلام. 

مثال:

$users = User::with('posts')->get();

يتم استرداد قائمة المستخدمين من قاعدة البيانات مع تحميل المنشورات المرتبطة بهم.

أي تستخدم load عندما تحتاج إلى تحميل العلاقات بشكل فردي لنموذج محدد، بينما يُفضل استخدام with عندما تحتاج إلى تحميل العلاقات مع الاستعلام الأساسي للاستفادة من التحميل المسبق وتقليل استعلامات قاعدة البيانات.

  • 0
نشر

كلا الأساليب تحقق نفس النتائج، وهي تحميل نموذج ذي صلة على النموذج الأول. في الواقع، كلاهما يقومان بتشغيل نفس الاستعلامين. الفرق الرئيسي هو أن with() يحمل النموذج ذي الصلة مسبقًا، فوريًا بعد الاستعلام الأول (all ()، first ()، أو find (x)، على سبيل المثال)؛ عند استخدام load()، تقوم بتشغيل الاستعلام الأول أولاً، ثم تحميل النموذج ذي الصلة في وقت لاحق.

"التحميل الفوري" هنا يعني أننا نربط جميع النماذج ذات الصلة لمجموعة نتائج معينة باستخدام استعلامة واحدة فقط، بدلاً من الحاجة إلى تشغيل n استعلامات، حيث n هو عدد العناصر في المجموعة الأولية.

يمكن استخدام with() للتحميل الفوري

على سبيل المثال، إذا استخدمنا with() للتحميل الفوري:

$users = User::with('comments')->get();

... إذا كان لدينا 5 مستخدمين، يتم تشغيل الاستعلامين التاليين على الفور:

select * from `users`
select * from `comments` where `comments`.`user_id` in (1، 2، 3، 4، 5)

... وننتهي بمجموعة من النماذج التي تحتوي على التعليقات المرتبطة بنموذج المستخدم، لذلك يمكننا القيام بشيء مثل

$users->comments->first()->body.

يمكن استخداما باستخدام load()، يمكننا فصل الاستعلامين، أولاً عن طريق الحصول على النتيجة الأولية:

$users = User::all();

الذي يشغل:

select * from `users`

وفي وقت لاحق، إذا قررنا أننا بحاجة إلى التعليقات ذات الصلة لجميع هؤلاء المستخدمين، يمكننا تحميلها في وقت لاحق:

$users = $users->load('comments');

الذي يشغل الاستعلام الثاني:

select * from `comments` where `comments`.`user_id` in (1، 2، 3، 4، 5)

ونحن ننتهي بنفس النتيجة، مقسمة إلى خطوتين. مرة أخرى، يمكننا استدعاء $users->comments->first()->body للوصول إلى النموذج ذي الصلة لأي عنصر.

لماذا استخدام load() مقابل with()؟ يمنحك load() خيار تحديد ذلك لاحقًا، بناءً على بعض الشروط الديناميكية، سواء كنت تحتاج إلى تشغيل الاستعلام الثاني أم لا. إذا كان لا شك في أنك ستحتاج إلى الوصول إلى جميع العناصر ذات الصلة، استخدم with().

البديل لكل من with() و load() هو التكرار عبر مجموعة النتائج الأولية والاستعلام عن العلاقة hasMany() لكل عنصر. هذا سيؤدي إلى تشغيل n+1 استعلامات، أو 6 في هذا المثال. التحميل الفوري، بغض النظر عما إذا تم تنفيذه مباشرة باستخدام with() أو في وقت لاحقًا باستخدام load()، يشغل 2 استعلامات فقط.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...