تالار گفتمان nCIS.ir

نسخه‌ی کامل: خروجی اطلاعات کشورها و استانها توسط رابطه بین مدل ها
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان ، وقت همگی بخیر .

من یه مدل برای کشورها ، استانها دارم به اسم :
Tourlocation

یه مدل هم دارم برای معرفی تورها ( Tour ) اون کشورها و استانها که به رابطشون به این شکله :
رابطه کشور و استانها : یک به چند
رابطه استان به کشور : یک به یک
رابطه کشور به تور : چند به چند
رابطه استان به تور : چند به چند


هر تور میتونه به تنهایی برای یک کشور باشه و همچنین میتونه شامل استانهای زیادی هم بشه ( مثلا تور های ترکیبی که میتونه شامل چندین استان و کشور بشه )



حالا مسئله اینجاست :
وقتی میخوام تورهای یک کشور رو با تورهای استانهای اون کشور بگیرم ، مشکل دارم و در دو مرحله باید انجام بشه :

اینطوری تورهای اون کشور رو میگیرم :
$country->tours

اینطوری هم تورهای استانهای اون کشور رو ببینم :
$country->province->tours


تو این حالت اگر یک تور درون یک کشور و یکی از استانهای اون کشور ثبت شده باشه ، یکبار درون تورهای اون کشور و یکبار درون تورهای استانهای اون کشور نمایش داده میشه

با groupBy هم نتونستم خروجی رو یونیک کنم


کدی که نوشتم :

$country = AppTourlocation::where('slug' , '=' , $slug)->where('type', '=', 1)->with(['tours', 'province.tours' => function($query) {
    $query->orderBy('tours.id' , 'DESC')->groupBy('id');
}])->first();
تحلیلتون اشتباهه. وقتی یکطرف رابطه «یک به چند» میشه، اونطرف رابطه «چند به یک» هست نه «یک به یک».
درسته ، اشتباه برداشت کردم ظاهرا

ولی مشکلم حل نشد متاسفانه :(

ممنون میشم راهنماییم کنید که این مشکل رو رفع کنم .
فکر میکنم باید با یک جوین این مشکل رو رفع کنم

یک جدول واسط بین کشورها و استانها با تورها دارم که باید جوین بزنم بینشون و تورهاشونو بکشم بیرون اما تا اینجا تونستم فقط کشورها و استانهای اون کشور رو بگیرم ، حالا یه جوین دیگه میخوام که لیست تورهای اون جاذبه گردشگری رو برام بگیره و خروجی بده :

یه همچین چیزی در اومده تا اینجا :

$country = DB::table('tourlocations')
    ->join('tourlocation_tour', 'tourlocations.id', '=', 'tourlocation_tour.tourlocation_id')
    ->where('tourlocations.id', $id)
    ->orWhere('tourlocations.parent_id', $id)
    ->select('tourlocations.name')
    ->groupBy('tourlocations.id')
    ->get();
خیلی کامنتتون طولانی شد در یک خط خلاصه میکردین چی میخواهید. تحلیل دیتابیس که خب اشکال داره شما باید سه تا جدول داشته باشید که به این صورت بیایید اول کشور رو به استان ها ارتباط بدین و سپس استان رو به تورهاش مرتبط کنید دیگه نیازی نیست رابطه ای بین کشور و تور برقرار بشه چون توی Eloquent میتونید با یک کوئری Nested مستقیما با یک کوئری تورهای استانهای یک کشور رو بگیرید و لزوم استفاده از groupBy رو متوجه نشدم فکرمیکنم اگر درست طراحی میکردین احتمالا نباید بهش نیازی داشته باشید
استفاده از یک تیبل دلایل مختلفی داشته که یکیش سرعته کاره و دومیش ساختار سایتم که لیست کشور ها و استانها باید باهم باشن تا مدیر سایت بتونه هر دو رو بصورت همزمان انتخاب کنه ، یعنی یک تور میتونه عضو یک یا چند کشور باشه و همزمان عضو یک یا چند استان هم باشه و یا ترکیب ای دوتا برای همین مجبور بودم چنین کاری کنم و دلیل سومی هم که داره اینه که رابطه بین تورها و کشورها و استانها از نوع چند به چند هستش بخاطر همین نمیشد که جداشون کنم .