احمد
3 سال پیش توسط احمد مطرح شد
32 پاسخ

نحوه ذخیره کردن آرایه در جدول رابط توسط متد sync

سلام دوستان. من هنگام ایجاد محصول جدید یه بخش اضافه کردم که رنگ محصول به همراه قیمت و موجودی محصول رو انتخاب میکنم.
در ضمن جدول colors با جدول products رابطه چند به چند داره.
و بوسیله جاوا اسکریپ id ها رو گروه بندی کردم تا مشخص بشه که قیمت و موجودی مربوط به کدام رنگ هست. به این شکل :

name="colors[${id}][color]" => آدی رنگ 
name="colors[${id}][pricecolor]" => آی دی قیمت
name="colors[${id}][inventory]" => آی دی موجودی

بعد اومدم و در productController اون رنگ رو اعتبار سنجی کردم. به این شکل:

 $color_validate = $request->validate([
            'colors.*.color' => 'required',
            'colors.*.pricecolor'   => 'required|min:3',
            'colors.*.inventory'   => 'required'
        ]);

الان میخام این ویژگی هارو در جدول واسط colorproduct ثبت کنم.
جدول colorproduct :

color_product:
color_id
product_id
pricecolor
inventory

خوب دوستان الان سوال من این هست که چجوری این ویژگی ها(رنگ و قیمت و موجودی ) رو در جدول واسط ذخیره کنم؟
مدل product :

 public function colors() 
    {
        return $this->belongsToMany(Color::class)->withPivot(['pricecolor', 'inventory']);;
    }

ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

با عرض پوزش کد زیر تست کن
چون ارایه هست من به صورت object اشتباهن درخواست دادم

$product->colors()->sync($color_validate['colors']);

محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش آپدیت شد
0

میشه تویsync به جای test بنویسی

$color_validate->colors

اینطوری منظورم :

$product->colors()->sync($color_validate->colors);

بعد تست کنی که ایا کار میکنه یا نه بازم پروژت؟ ب نظرم ذخیره بشه بازم


احمد
@ahmad316948 3 سال پیش مطرح شد
0

@salar.mohammad2013
سلام تست کردم این خطا رو میده Trying to get property 'colors' of non-object


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

با عرض پوزش کد زیر تست کن
چون ارایه هست من به صورت object اشتباهن درخواست دادم

$product->colors()->sync($color_validate['colors']);

احمد
@ahmad316948 3 سال پیش مطرح شد
0

@salar.mohammad2013
بله با این روش هم جواب داد و داده ها با موفقیت ذخیره شدند


احمد
@ahmad316948 3 سال پیش مطرح شد
0

@Rp76
@salar.mohammad2013
@mohaligateway
حالا یه مسئله دیگه: من اومدم و تو صفحه جزئیات محصول رنگ و قیمت و موجودی رو هم نمایش دارم. خوب الان میخام قبل از نمایش رنگ ها چک کنه که اگه رنگی موجودی اون برابر با 0 بود اون رنگ رو نشون نده. چجوری این شرط رو بنویسم؟

اینم سورس ویو:

 <form action="{{ route('cart.add' , $product->id )}}" method="POST" id="add-to-cart">
                            @csrf
                            <div>

                                @foreach ($product->colors as $color)

                                <div class="custom-control custom-radio">
                                    <input type="radio" id="{{$color->id}}" value="{{$color->id}}" name="color" required class="">
                                    <label class="custom-control-label2" for="{{$color->id}}">
                                        <p>
                                         رنگ: &nbsp; {{$color->name}} &nbsp;<div style=" display:block;  border: 10px solid {{$color->code}};
                                         border-radius: 50%; width: 1.7rem; height: 1.7rem;"></div>
                                         @foreach ($color->warranties as $warranty)
                                           &nbsp;  گارانتی: {{$warranty->name}}
                                         @endforeach
                                       &nbsp; قیمت افزوده: 
                                       @if($color->pivot->pricecolor)
                                            {{$color->pivot->pricecolor}} تومان
                                        @else
                                        -
                                       @endif

                                        </p>

                                    </label>
                                </div>
                                @endforeach

                            </div>
                                    <div class="product-details-action">
                                        <div class="details-action-col">
                                           <!-- <div class="product-details-quantity">
                                                <input type="number" id="qty" class="form-control" value="1" min="1"
                                                    max="10" step="1" data-decimals="0" required>
                                            </div>--><!-- End .product-details-quantity -->

                                          <span onclick="document.getElementById('add-to-cart').submit()" class="btn-product btn-cart">افزودن به سبد خرید</span>
                                        </div><!-- End .details-action-col -->

                                        <div class="details-action-wrapper">
                                            <a href="#" class="btn-product btn-wishlist"
                                                title="لیست علاقه مندی"><span>افزودن
                                                    به لیست علاقه مندی</span></a>
                                            <a href="#" class="btn-product btn-compare" title="مقایسه"><span>افزودن به
                                                    لیست مقایسه</span></a>
                                        </div><!-- End .details-action-wrapper -->
                                    </div><!-- End .product-details-action -->
                                </form>

محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش آپدیت شد
0

اگر اشتباه نکنم inventory که توی جدول واسط هست موجودیه؟
خیلی راحت یه شرط میزاری کل اون چیزی که نشون دهنده ی رنگه
ک اگر اشتباه نکنم هرچی داخل foreach داری میشه به شکل زیر همه رو بزار تو شرط
خروجیش رو تست بگیر مقدار اگر صفر باشه شرط اجرا نمیشه هرچی بجز صفر باید اجرا شه
تست کن

        if($color->pivot->inventory){

        }

احمد
@ahmad316948 3 سال پیش مطرح شد
0

@salar.mohammad2013
سلام ممنون کارکرد.الان چجوری چک کنم وقتی موجودی همه رنگ های محصول برابر با 0 بود یه پیغام نمایش بدم و دکمه افزودن به سبد خرید هم نمایش داده نشه؟ باید از کالکشن ها استفاده کنم؟


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

پیشنهاد میکنم گفتو گوی دیگری ایجاد کنید چون موضوع چرخیده.
نه این راه های مختلفی داره میتونی توی کنتربر چک کنی و به صفحه ویو متغیری رو بفرستی یا کوئری چیزی بزنی
دستت بازه بالاخره راه هست

ساده ترینش که ب ذهن میاد شما قبل از حلقه ی foreach یه فلگ قرار میدی مثلا has_color=false$ یعنی در ابتدا فرض میکنیم خالی هست و رنگی نداریم
داخل حلقه و داخل if که نوشتی مینویسی has_color=true$ با این کار با تنها یک رنگ که وارد if بشه مشخص میشه که رنگی بوده و اون فلگ میشه true
حالا خیلی راحت اونجا که دکمه افزودن به سبد رو گذاشتی میتونی یه شرط بزاری اگر رنگ داشتیم همون دکمه رو نشون بده اگر نداشتیم disable باشه و مثلا داخلش بنویسه موجود شد به من اطلاع بده یا نا موجود یا هرچی


<form action="{{ route('cart.add' , $product->id )}}" method="POST" id="add-to-cart">
    @csrf
    <div>
        @php
            $has_color=false;
        @endphp

        @foreach ($product->colors as $color)
            @if($color->pivot->inventory)
                @php
                    $has_color=true;
                @endphp

                <div class="custom-control custom-radio">
                    <input type="radio" id="{{$color->id}}" value="{{$color->id}}" name="color" required class="">
                    <label class="custom-control-label2" for="{{$color->id}}">
                        <p>
                            رنگ: &nbsp; {{$color->name}} &nbsp;<div style=" display:block;  border: 10px solid {{$color->code}};
                            border-radius: 50%; width: 1.7rem; height: 1.7rem;"></div>
                        @foreach ($color->warranties as $warranty)
                            &nbsp;  گارانتی: {{$warranty->name}}
                        @endforeach
                        &nbsp; قیمت افزوده:
                        @if($color->pivot->pricecolor)
                            {{$color->pivot->pricecolor}} تومان
                        @else
                            -
                            @endif
                            </p>
                    </label>
                </div>
            @endif     

        @endforeach

    </div>
    <div class="product-details-action">
        @if($has_color)
            <div class="details-action-col">
                <!-- <div class="product-details-quantity">
                     <input type="number" id="qty" class="form-control" value="1" min="1"
                         max="10" step="1" data-decimals="0" required>
                 </div>--><!-- End .product-details-quantity -->

                <span onclick="document.getElementById('add-to-cart').submit()" class="btn-product btn-cart">افزودن به سبد خرید</span>
            </div><!-- End .details-action-col -->
        @else
            <div class="details-action-col">
                <!-- <div class="product-details-quantity">
                     <input type="number" id="qty" class="form-control" value="1" min="1"
                         max="10" step="1" data-decimals="0" required>
                 </div>--><!-- End .product-details-quantity -->

                <span class="btn-product btn-cart disabled">ناموجود</span>
            </div><!-- End .details-action-col -->

        @endif

        <div class="details-action-wrapper">
            <a href="#" class="btn-product btn-wishlist"
               title="لیست علاقه مندی"><span>افزودن
                                                    به لیست علاقه مندی</span></a>
            <a href="#" class="btn-product btn-compare" title="مقایسه"><span>افزودن به
                                                    لیست مقایسه</span></a>
        </div><!-- End .details-action-wrapper -->
    </div><!-- End .product-details-action -->
</form>

احمد
@ahmad316948 3 سال پیش مطرح شد
0

@salar.mohammad2013
سلام ممنون واقعا ایده جالبی به کار بردین. من فکر میکردم باید برای این مورد کلی تحلیل و کد بزنم ولی واقعا فکرشو نمیکردم به این سادگی باشه😄
میشه راه ارتباطی با شما رو داشته باشم؟


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

آیدی تل بده بهت پیام بدم ولی پیشنهاد میکنم توی گفت و گو ها درخواست بدی تا بقیه هم نظر بدن و بقیه هم استفاده کنن
الان برای همین روش من یه نفر میاد بهترشو میگه منم یاد میگیرم اینطوری


احمد
@ahmad316948 3 سال پیش مطرح شد
0

@salar.mohammad2013
بله درست می فرمایید ولی چون سوالم در راستای این گفتگو هست و تو این گفتگو روند کار رو به طور کامل باز کردم و شما هم در جریان هستید. برا همین اگه یه گفتگو دیگه باز کنم باید بشیم و دوباره روند کار رو باز کنم تا دوستان متوجه درخواست من بشن.
@Ahmad3169


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام