اذهب إلى المحتوى

السؤال

نشر

السلام عليكم 

قمت أولا بالتغيير على برنامج معمول مسبقا وخصصته بحسب متطلباتي بحيث أنني 

أردت جعل أحد الحقول و الذي هو عبارة عن المنتج غير محدود بعدد معيين بعبارة أخرى اردت جعل كمية المنتج تتناسب مع  كمية الطلب  مهما طلب المستخدم يكون متوفر  , وبالتالي قمت بجعله في ملف التهجير NULLABLE  و قمت كذلك بإعادة تعيينه في قاعدة البيانات كلما طُلب المنتج أي كلما دخل المتج الى عربة التسّوق وكان الكود النتاتج عن ذلك كالتالي : أضفت السطرين الذان علقت بجانبهما

    public function addToCart(Request $request)
    {
        $book = Book::find($request->id);
        $book->number_of_copies += $request->services ; //أضفت هذا
        $book->save();                                  //وهــــذا
        if(auth()->user()->servicesInCart->contains($book)) {
            $newQuantity = $request->services + auth()->user()->servicesInCart()->where('book_id', $book->id)->first()->pivot->number_of_copies;
                auth()->user()->servicesInCart()->updateExistingPivot($book->id, ['number_of_copies'=> $newQuantity]);
            
                
        } else {
            auth()->user()->servicesInCart()->attach($request->id, ['number_of_copies'=> $request->services]);
        }

        return redirect()->back();

    }

إلى الآن كل شيء بخير فمثلا عندما أضيف 50 نسخة من منتج إلى السلة و أتوجه إلى قاعدة البيانات لارى أجد انه بالفعل تم إضافة 50 نسخة منه لقاعدة البيانات للمنتج المعيين

وقمت أيضا بجعل القيمة في قاعدة البيانات تتناقص في حالة لو قام بالضغط على "ازل واحد "  قمت بالتالي الذي اشرت له في الكود بالتعليق :

<?php

public function removeOne(Book $book) {
        $oldQuantity = auth()->user()->servicesInCart()->where('book_id', $book->id)->first()->pivot->number_of_copies;
        
        if($oldQuantity > 1) {
            auth()->user()->servicesInCart()->updateExistingPivot($book->id, ['number_of_copies'=> --$oldQuantity]);
            --$book->number_of_copies;//اضفت هذا
            $book->save();            //وهـــذا
        } else {
            $oldQuantity = auth()->user()->servicesInCart()->where('book_id', $book->id)->first()->pivot->number_of_copies;
            $book->number_of_copies = $book->number_of_copies - $oldQuantity;
            $book->save();
            auth()->user()->servicesInCart()->detach($book->id);
        }

        return redirect()->back();
    }

المشكلة التي واجهتها هي عند ازالة كل المنتج من السلة لا يتم إزالته من قاعدة البيانات ويبقى العدد موجود وبالتالي تخرب حسابات البرنامج الكود الذي لم ينجح معي كالتالي :

  <?php

public function removeAll(Book $book) {
        $oldQuantity = auth()->user()->servicesInCart()->where('book_id', $book->id)->first()->pivot->number_of_copies;

        $book->number_of_copies - $oldQuantity;//اضفت هذا 
        $book->save();                         //وهـــذا
        auth()->user()->servicesInCart()->detach($book->id);

        return redirect()->back();
    }

أرجوا منكم توجيهي لحل المشكل و إخباري إن كانت الطريقة معمول بها أم لا وهل يوجد أحسن منها او طريقة مشابهة لها اقتبس منها 

شكرا لكم 

 

 

Recommended Posts

  • 1
نشر

لا أدري ما المُشكلة التي تحدث لك لكن السطر المسؤول عن حذف السجل من الجدول الوسيط ليس به خطأ:

auth()->user()->servicesInCart()->detach($book->id);

و أعتقد أنه يعمل.

ما لاحظته أنه عند حذف كل المُنتج من السلة لا تقوم بعملية إسناد للقيمة الجديدة لاحظ هذا السطر:

$book->number_of_copies - $oldQuantity;

هنا أنت تقوم بعملية طرح فقط كأن تقول 10 - 2 لكن لا تحفظ القيمة الجديدة في خاصية number_of_copies لذلك الكائن. يجب عليك التعديل:

$book->number_of_copies = $book->number_of_copies - $oldQuantity;

// أو

$book->number_of_copies -= $oldQuantity;

بإمكانك إستخدام التوابع Increment & Decrement مباشرةً عوض اسناد القيمة للخاصية ثم إستدعاء التابع save.

بهذا الشكل:

$book->decrement('number_of_copies ', $oldQuantity);

بهذا الشكل سيتم التعديل مُباشرة في جدول الكتب. لا تستدعي التابع save.

و في حالة حذف نُسخة واحدة تستخدم:

$book->decrement('number_of_copies ');

لاحظ لم أمرر قيمة للمُعامل الثاني و في هذه الحالة سيتم إستخدام القيمة الإفتراضية و هي 1 أي أنه سيتم الإنقاص بـ 1 نفس الملاحظة في التابع increment يُمكنك إستخدامه في التابع addToCart.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...