سلام.
من پنج جدول دارم که به ترتیب با هم ارتباط دارن.
Country -> University ->Faculty ->Field -> Master
هر جدول از طریق کلید خارجی با جدول قبلی ارتباط داره. حالا میخوام مثلا از جدول master مستقیم به جدول country دسترسی داشته باشم و نام کشور رو داشته باشم. برای دسترسی مستقیم راهی وجود داره یا باید به ترتیب مدل ها رو فراخوانی کنم؟
سلام می تونید از پکیج زیر استفاده کنید :فکر نکنم لاراول همچین چیزی داشته باشه.می تونید از deep استفاده کنید...
https://github.com/staudenmeir/eloquent-has-many-deep
سلام
@t.chegini
این پست رو ببینید
یکی از دوستان پکیجی ، تقریبا شبیه چیزی که شما میخوایید طراحی کردن
فکر کنم بشه بر اساس پروژه شما هم مورد استفاده قرار داد
https://roocket.ir/discuss/6117
برادر @ali.bayat به نظر باید بشه نه؟
مال شما روی یه مدل کار میکنه یا با چند مدل هم میشه ارتباط برقرار کرد؟
درود
پکیج Categorizable روی چندین مدل قابل پیاده سازیه.. اگر جداولی که دوستمون اشاره کرد (Country, University , ...) رو به عنوان دسته بندی در نظر بگیریم بله میشه ازش استفاده کرد.
@t.chegini
اگر به این شکل نگاه کنیم که هر رابطه در واقع یه کوئری SQL هست... ۴ مرحله از روابط برای دریافت یه فیلد میتونه فشار قابل توجهی روی سرور بیاره.
روابط بین جداول لاراول عالی هستند اما اگر مراقب نباشید دچار مشکل N + 1 میشید. (مثلا برای دریافت ۱۱ رکورد از دیتابیس دارید ۱۱ + ۱ کوئری میزنید) در حین توسعه با لاراول حتما پکیج زیر رو نصب کنید و تعداد کوئری ها رو بررسی کنید:
https://github.com/barryvdh/laravel-debugbar
بهترین روش برای شما، روشیه که با کمترین تعداد کوئری داده ها رو دریافت کنید
https://github.com/staudenmeir/eloquent-has-many-deep
از همین پکیجی که دوستمون بالاتر معرفی کردن به راحتی میتونید تا چندین جدول پیش برید، و برعکسشم با همین پکیج قابل انجام هست
@ali.bayat
ممنون بابت راهنماییتون.
مشکل من اینجاست که بین جدول master و جدول country کلید مشترک ندارم که بتونم بینشون ارتباط برقرار کنم. هر جدول فقط کلید اصلی جدول قبلی رو داره.
سرچ که کردم خودم پکیج has- many- deep رو پیدا کردم. ولی تست که کردم فقط بین سه جدول جواب میداد. یعنی اولی رو با سومی ارتباط میده. برای مثال من که مجموعا حدود 9 تا جدول دارم که همشون به هم ارتباط یک به چند و چند به چند دارن، نتونستم روش بهتری پیدا کنم.
منظورتون از Global Scope چیه؟
@webazin.org90
ممنونم.
اینو خودم تست کردم. تا سه تا جدول جواب میداد. البته شاید من نتونستم برای تعداد بیشتری جدول جواب بگیرم.
باید مجدد بررسی کنم.
گلوبال اسکوپ برای افزودن شرط های ویژه به یک مدل در حین دریافت داده ها به کار میره. مثلا برای دریافت University هایی که مختص به یه Country خاص هستند
https://laravel.com/docs/6.x/eloquent#global-scopes
یه نکته دیگه: شما نیازی به کلید مشترک بین master و country ندارید. میتونید اول Country رو به همراه University ایگر لود کنید و سپس University رو با Faculty و الا آخر.. به این شکل هروقت Country رو بگیرید تمام اطلاعات زیر مجموعه هاش رو هم دارید اما این حجم زیادی از اطلاعات میشه..
اگرم هم بتونید از پکیج has- many- deep بصورت مولتی لول استفاده کنید، خوبه
درود، توی مثالی که خودش گفته 4 تا جدول رو مثال زده، و بیشتر هم میشه، فقط شما باید کلید های خارجی رو به درستی تعریف کنید
سلام ولی بریم به تیلور بگیم واسه اینجور روابط هم یه چیزی پیاده کنه یا بیایید خودمون پیاده کنیم نظرتونه چیه ؟؟؟
@t.chegini شما که استادید....
@ali.bayat
@webazin.org90
@Alimotreb
حسام جان @hesammousavi شما هم لطف کن موقعی که میخوای با خالق لاراول یه بحث گفتگو داشته باشی این موضوع رو هم بهش بگو مرسی...
اره، منم واسم عجیبه چرا از این پکیج هایی که لاراول رو قوی تر میکنه استفاده نمیکنن، این روابط به نظر من خوبه باشه
سلام
@ali.bayat
پکیج شما اولین چیزی بود که به ذهنم رسید
این موضوع یه هوا پیچیده شد گویا ، زنگ بزنیم به این تیلور بگیم راه حلت چیه این جور موقع ها @davoodkhany :)))
ولی خب حرفت درسته برادر ، باید از دیباگر ، چیزی که کمترین کوئری رو میزنه پیدا کرد !
به نظر خودت بهترین کار چیه ، من گفتم به چشم دسته بندی ببینیمش تا بتونیم راحت تر پیاده سازیش کنیم...!
@Alimotreb
من تو یه همچین پروژه ای بودم واقعا رابطه ها گیج کننده و یکم که نه خیلی تو در تو ... شاید پروژه خانم @t.chegini شبیه پروژه ما بوده واقعا بزرگ و پیچیده از همه بدتر یه سرچ خیلی بزرگتر داشت ...
@ali.bayat :
ممنونم. دقیقا الان همین کار رو کردم و صحیح جواب میده. اما موضوع تعداد زیاد کوئری ها و حجم زیاد داده های return شده است. هر جدول حدود 80 تا فیلد داره که تو هر سرچ، همه فیلدهای همه جدول های قبلی رو برمیگردونه.
@webazin.org90 :
ممنونم. من به جداول و روابط بینشون تسلط کامل دارم. مطمئنم که مشکلی توی تعریف کلیدها و ارتباطات جداول پروژم ندارم. اما نتونستم این پکیج رو جواب بگیرم. مجدد تست میکنم.
@davoodkhany :
ممنونم. یه کلک هم میشد زد که قطعا روش حرفه ای نیست اما جواب میده. اونم اینه که مثلا تو جدول Master کلید اصلی 4 جدول قبلی رو هم قرار داد. یعنی به جای اینکه هر جدول یه کلید خارجی داشته باشه، کلید خارجی تمام جدول های قبلی رو براش بزاریم. اینطور مثلا از جدول Master میشه مستقیم به جدول University دسترسی داشت. از نظر بحث افزونگی توی دیتابیس میدونم روش صحیحی نیست اما از اون همه کوئری های تودرتو که سیستم مجبوره اجرا کنه بهتره.
T.chegini
پس برید دیتا بیس رو از دوباره پیاده سازی کنید و پروژه رو از دوباره بیارید بالا منم کمکتون می کنم :)))))
@davoodkhany
سخت ترین کار، تحلیل پروژه و ارتباط بین جداول بود که تا الان 32 تا جدول گذاشتم. اگر واقعا روشی پیدا کنم که کدنویسی ارتباطات چند به چند بین این جداول رو برام آسون کنه، حاضرم از اول پروژه رو بنویسم. فرم ها هم که همه آماده است. شما فقط یک روش حرفه ای پیشنهاد بده باقی حله.
بهینه بودن کوئری ها اولیت بیشتری داره نسبت به حجم داده برگشتی. در نهایت شمایید که باید داده برگشتی رو پیمایش کنید و موارد لازم رو نشون بدید یعنی سختیش برای توسعه دهنده هست و فشاری روی سرور نمیاره
راهی هم که گفتید که بین تمام جداول ارتباط مستقیم بوجود بیارید، گزینه بدی نیست فقط کمی شلوغ کاریش زیاد میشه. حالت های مختلف رو تست کنید و حتما از debugbar استفاده کنید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟