مهدی 3 گزارش دادن ارسال شده در خرداد 99 با سلام.اگه بخوام یه جدول categoriesداشته باشم که هر دسته بندی بتونه چند تا عکس داشته باشه و هر عکس بتونه چند تا برچسب(تگ) داشته باشه باید چطوری این رابطه رو پیاده سازی کنم؟میتونم دوبار HasMany استفاده کنم؟ یا باید از HasManyThrought استفاده کنم؟یا راه دیگه ای داره؟ نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 سلام اگر بخواهید برای یک دسته بندی (category) خاص تمامی تصاویر مرتبط با انرا بازیابی کنید باید از رابطه یک به چند بین دسته بندی و تصویر استفاده کنید. همین طور برای تصویر و برچسب (tag). اگر هدفتان بازیابی تمامی برچسب های متعلق به یک دسته بندی خاص باشد(جدول تصویر به عنوان واسط) می توانید از رابطه HasManyThrough در مدل Category استفاده کنید. البته می توانید از هر دوی آنها بصورت همزمان استفاده کنید.در حالت کلی بسته به نیازتان می توانید از این روابط استفاده کنید. برای مثال اگر جدول categories شما ستون های id، name، slug و parent داشته باشد و بخواهید از دسته بندی های تو در تو (یک سطحی و یا چند سطحی) استفاده کنید، می توانید یک رابطه یک به چند در داخل مدلCategory تعریف کنید. فرضا اگر بخواهید تمام دسته بندی هایی که زیر مجموعه یک دسته بندی خاص هستند را بدست آورید می توانید تابع children را بصورت زیر تعریف کنید: public function children () { return $this->hasMany(Category::class, 'parent'); } در صورتیکه شما برای یک دسته بندی خاص تابع را فرخوانی کنید، تمام دسته بندی هایی که مقدار فیلد parent آنها با فیلد id دسته بندی مورد نظر برابر باشد، بازیابی می شود. در قطعه کد زیر فرض بر آن است که هر دسته بندی حداکثر یک زیر مجموعه دارد.(پیاده سازی دسته بندی های چند سطحی با استفاده از توابع بازگشتی امکان پذیر است که خارج از حوصله این پست است) <ul> @foreach($categories As $category) <li id='{{ $category->id }}'>{{ $category->name }} @if($category->children) @php $sub_cats = $category->children()->select('id', 'name')->get(); @endphp <ul> @foreach($sub_cats As $sub_cat) <li id='{{ $sub_cat->id }}'>{{ $sub_cat->name }}</li> @endforeach </ul> @endif </li> @endforeach </ul> امیدوارم که این پاسخ مشکل شما را برطرف کرده باشد. موفق باشید. نقل قول Share this post Link to post Share on other sites
مهدی 3 گزارش دادن ارسال شده در خرداد 99 ممنون از پاسختون چيزاي خوبي ازش ياد گرفتم منتها سوال من جواب نداد.سوال من اينکه بشه به برچسب هاي يک عکس خاص که متعلق به يک دسته بندي خاص دسترسي داشت.رابطه ی یک به چند میانی فقط برچسب های یک دسته بندی میده که مد نظر من نیست و از دوبار رابطه یک به چندم نمیشه استفاده کرد چون اول میاد عکس های دسته بندی رو میده واین یک مجموعه است که خاصیت تگ نداره و به ارور میخورم نقل قول Share this post Link to post Share on other sites
مهدی 3 گزارش دادن ارسال شده در خرداد 99 و البته این مسئله که بشه برچسب ها رو به تک تک حساب کرد مثلا اگر عکس اول برچسب فروشگاهی و اداری وعکس دوم برچسب فروشگاهی و ورزشی داشته باشه تو خروجی فروشگاهی ورزشی اداری تحویل بده یجواریی شبیه تابع distinct نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 سلام همانطور که گفتم شما باید روابط یک به چند را برای جداول دسته بندی (categories) و تصاویر (images) و همچنین تصویر و برچسب (tags) را پیاده سازی نمایید. بعد از پیاده سازی آنها از کد زیر استفاده کنید تا در یک جدول مقادیر id و name و تصاویر و هم چنین برچسب ها(بدون تکرار) را نمایش دهد. <table> <tr> <th>id</th> <th>name</th> <th>images</th> <th>tags</th> </tr> @foreach($categories as $category) <tr> <td>{{ $category->id }}</td> <td>{{ $category->name }}</td> <td> @php $pics = []; @endphp @foreach($category->images()->pluck('src') as $src) $pics[] = $src; @endforeach {{ implode(',', $pics) }} </td> <td> @php $tags = []; @endphp @foreach($category->images()->get() as $image) @foreach($image->tags()->pluck('name') as $name) $tags[] = $name; @endforeach @endforeach {{ get_tags($tags) }} </td> </tr> @endforeach </table> تابع برای حذف عناصر تکراری از یک آرایه بصورت زیر تعریف شده است: function get_tags($tags) { $result = array(); for ($tags as $tag) { if (!in_array($tag, $result)) $result[] = $tag; } return implode(',', $result); } امیدوارم که این پاسخ مشکل شما را برطرف کرده باشد. موفق باشید. نقل قول Share this post Link to post Share on other sites
مهدی 3 گزارش دادن ارسال شده در خرداد 99 چطوری میشه تو فایل blade تابع تعریف کرد(اگه تابع get_tagبین دوتا تگ php بزارم ارور میده)؟ نقل قول Share this post Link to post Share on other sites