حريصة على تحميل العلاقات المتداخلة بعمق؟
سؤال
لدي سلسلة من الجداول المرتبطة مثل ذلك؛
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