رفتن به مطلب
انجمن پشتیبانی لاراول ایران

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

مهدی

روابط در لاراول

Recommended Posts

با سلام.اگه بخوام یه جدول categoriesداشته باشم که هر دسته بندی بتونه چند تا عکس داشته باشه و هر عکس بتونه چند تا برچسب(تگ) داشته باشه باید چطوری این رابطه رو پیاده سازی کنم؟میتونم دوبار HasMany استفاده کنم؟ یا باید از HasManyThrought استفاده کنم؟یا راه دیگه ای داره؟

Share this post


Link to post
Share on other sites

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

سلام

اگر بخواهید برای یک دسته بندی (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

ممنون از پاسختون چيزاي خوبي ازش ياد گرفتم منتها سوال من جواب نداد.سوال من اينکه بشه به برچسب هاي يک عکس خاص که متعلق به يک دسته بندي خاص دسترسي داشت.رابطه ی یک به چند میانی فقط برچسب های یک دسته بندی میده که مد نظر من نیست و از دوبار رابطه یک به چندم نمیشه استفاده کرد چون اول میاد عکس های دسته بندی رو میده واین یک مجموعه است که خاصیت تگ نداره و به ارور میخورم

Share this post


Link to post
Share on other sites

و البته این مسئله که بشه برچسب ها رو به تک تک حساب کرد مثلا اگر عکس اول برچسب فروشگاهی و اداری  وعکس دوم برچسب فروشگاهی و ورزشی داشته باشه تو خروجی فروشگاهی ورزشی اداری تحویل بده یجواریی شبیه تابع distinct

Share this post


Link to post
Share on other sites

سلام

همانطور که گفتم شما باید روابط یک به چند را برای جداول دسته بندی (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

وارد این گفتگو شوید

میتوانید پیام خود را ارسال کنید و بعد ثبت نام نمایید. در صورتی که حساب کاربری دارید, هم اکنون وارد شوید و در این گفتگو شرکت کنید.

مهمان
پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  Only 75 emoji are allowed.

×   لینک شما به صورت اتوماتیک جایگذاری شد.   نمایش به عنوان یک لینک به جای

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • جدید...