سؤال

لدي سلسلة من الجداول المرتبطة مثل ذلك؛

trainers -> hasMany -> programs
programs -> hasMany -> weeks
weeks -> hasMany -> days
days -> hasMany -> sessions
sessions -> hasMany -> phases
phases -> hasMany -> excersises

العلاقات في الاتجاه المعاكس كلها لها قبول واحد للتمارين على المراحل والتي لديها أيضًا العديد من الجداول المحورية

من الواضح أن الحصول على علاقات عميقة مثل هذه وفقًا للوثائق يعمل بشكل جيد

$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days')->get();

أحتاج إلى أن أكون قادرًا على استرداد محتويات البرنامج بأكمله واعتقدت أنه يمكنني تحميل كل علاقة متداخلة بشيء من هذا القبيل

$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days', 'weeks.days.sessions')->get();

أو

$programs = $this->program->orderBy('trainerId', 'asc')->take(1)->with('weeks.days.sessions')->get();

لكن كلاهما يُرجع FatalErrorException

دعوة إلى الطريقة غير المحددة إلقاء الضوء Support Facades Session :: NewQuery ()

ما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

من سؤالك، أستطيع أن أرى أن لديك علاقة متداخلة مثل ما يلي.

programs -> hasMany -> weeks
-----------------------------weeks -> hasMany -> days
----------------------------------------------------days -> hasMany -> sessions

من الصعب جدًا معرفة البيانات التي يجب تحميلها days إذا كنا لا نعرف weeks.وبالمثل بالنسبة ل sessions أيضًا.لذلك، علينا تحميل weeks البيانات أولا ثم days, ، ثم sessions.

من وثائق Laravel، يمكننا أن نرى التحميل السريع باستخدام الطريقة التالية:

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...)

تحميل لارافيل author البيانات على أساس books بيانات.

http://laravel.com/docs/eloquent#eager-loading

حاول التحميل weeks أولاً

$programs = $this->program->orderBy('trainerId', 'asc')
   ->take(1)
   ->with('weeks', 'weeks.days', 'weeks.days.sessions')
   ->get();

أو:

تحميل متلهف كسول:

 $programs = $this->program->orderBy('trainerId', 'asc')->take(1)->get();

 $programs->load('weeks', 'weeks.days', 'weeks.days.sessions');

نصائح أخرى

لذلك وجدت المشكلة وقد تساعد شخصا آخر لمعرفة الإجابة.أعطاني هذا الموضوع لحظة AHA منتديات Larvel

لدي نموذج يسمى الجلسة، يستخدم Larvel الاسم في مكان آخر في الإطار، DUH، لذلك عندما يحاول استدعاء النموذج الخاص بي، يقوم بالفعل بتوصيل فئة الجلسة الأخرى من مكان عميق في الإطار.بعض الحلول التي وجدتها اقتراح مساحات الأسماء لكنني لا أعتقد أن ذلك سيعمل من أجلي لأن إعلان العلاقة يمر ببساطة سلسلة مع اسم الفصل إلى الإطار.أعتقد أن هذا يعني أن دعوة الفصل يحدث في مكان آخر وسأحتاج إلى وضع مساحة الاسم / الاستخدام هناك تصحيح لي إذا كنت مخطئا من فضلك.

في كلتا الحالتين تغيير فئة الجلسة إلى جلسات وتغيير العلاقات بدعوة قضيت مشكلتي.

آمل أن يساعد هذا شخصا آخر لا تضيع 36 ساعة في محاولة لمعرفة ذلك: P

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top