راکت
محمد رضا
محمد رضا
5 سال پیش توسط محمد رضا مطرح شد
حل
22 پاسخ

مشکل ویرایش اطلاعات در لاراول

سلام و خسته نباشید
من یه سری اطلاعات دارم برای سفارشم که میخوام ویرایشش کنم
همه چیز ویرایش میشه تا جایی ک میبینم ب جز یک فیلد ک خیلی عجیبه برام (total_price)
توی fillable هم هست
اینا داده های من هست ک قراره ویرایش بشه ، دقیقا قبل از ویرایش داده ها رو خروجی گرفتم که مطمین شم مقدار میگیرن

array:12 [
  "created_at" => "2021-05-26 23:16"
  "delivery_type" => "presence"
  "total_price" => 6500000
  "credit_price" => 6500000
  "explain" => null
  "has_bonded" => "no"
  "discount" => 0
  "bonded" => 0
  "tax" => 0
  "payment_type" => "waiting"
  "changed" => "yes"
  "shift_history_id" => 3
]

اینم fillable من هستش

    protected $fillable=[
        'delivery_type',
        'customer_id',
        'payment_type',
        'status',
        'total_price',
        'credit_price',
        'has_bonded',
        'created_at',
        'discount',
        'discount_type',
        'tax',
        'explain',
        'bonded',
        'shift_history_id',
        'changed'
    ];

اینم جدولم

        Schema::create('orders', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('customer_id')->default(0);
            $table->unsignedBigInteger('shift_history_id');
            $table->foreign('shift_history_id')->references('id')->on('shift_histories')->onDelete('cascade');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->enum('delivery_type',['presence','unpresence']);
            $table->enum('payment_type',['cash','POS','cartToCart','credit','waiting','several'])->default('waiting');
            $table->enum('status',['received','preparing','deliverToCourier','delivered'])->default('received');
            $table->unsignedBigInteger('total_price');
            $table->unsignedInteger('credit_price')->default(0);
            $table->enum('has_bonded',['no','received','not_received'])->default('no');
            $table->unsignedInteger('discount')->default(0);
            $table->enum('discount_type',['percent','numerical'])->default('percent');
            $table->enum('changed',['yes','no'])->default('no');
            $table->enum('bonded_type',['money','evidence'])->default('money');
            $table->string('bonded');
            $table->integer('tax')->default(0);
            $table->text('explain')->nullable();
            $table->timestamps();
        });

کدی ک میزنم برای ویرایش به شکل زیر هست و all_data همون آرایه ای هست که در بالا قرار دادم

$order->update($all_data);

چیزی ک خیلی عجیبه اینه که همین داده ها برای create ارسال میشن (البته ب شکل کامل تر فیلد ها) و total_price مقدارش میشینه سر جاش ولی توی ویرایش نه

و نکته ی عجیب این که من بعد از کد بالا ب صورت تکی همین فیلد رو میگم آبدیت بشه کار میکنه و آبدیت میشه به شکل زیر

        $order->update([
            'total_price'=>$all_data['total_price']
        ]);

چرااااااااااااااا باید به صورت دسته جمعی با بقیه ویرایش نشه ولی ب صورت تکی ویرایش بشه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

@mohaligateway
@muhammad
@Rp76
@mrn
@juza66
@ali.bayat
@hesammousavi
@hosseinshirinegad98
@milad
@ajdar9667


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

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

        if($request->newCustomer) {
            $customer=Customer::create($request->newCustomer);
            $all_data['customer_id']=$customer->id;
            $order->update($all_data);
        }else{
            $order->update($all_data);
        }

مشکل برطرف شد
سپاس از همتون
عذر خواهم بابت گرفتن وقت شریفتون
@rezajahangir
@juza66
@MatinTayebi


رضا جهانگیر
رضا جهانگیر
تخصص :Full-Stack Developer
@rezajahangir5 سال پیشمطرح شد
0

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


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

اصل موضوع چیزی بود ک فرستادم براتون داده ای که به update داده میشه table و fillable
اینجا از validation و اینا استفاده نکردم ولی خب خروجی alldata رو میبینید قبل از ویرایش
یه سری کد هم بعدش هست ولی خب اونا مرتبط با محصولو این بحثا هست ک خود سفارش کار نداره

    public function update(Request $request, Order $order)
    {

        $shiftHistory=ShiftHistory::where('status','open')->limit(1)->get();
        if(!$shiftHistory->count()){
            return 'shift is closed';
        }

        $all_data=$request->all();
//        $all_data['user_id']=auth()->user()->id;
        $all_data['changed']='yes';

        $all_data['shift_history_id']=$shiftHistory->shift()->id;

        unset($all_data['products']);
        unset($all_data['several_pos']);
        unset($all_data['several_cash_credit']);
        unset($all_data['several_cart_to_cart']);
        unset($all_data['address']);

        $all_data['created_at']=toMilady($request->created_at);

//        dd($all_data);
        if($request->customer_id){
            $order->update($all_data);
        }else if($request->newCustomer) {
            $customer=Customer::create($request->newCustomer);
            $all_data['customer_id']=$customer->id;
            $order->update($all_data);
        }

        $order->update([
            'total_price'=>$all_data['total_price']
        ]);

//some code here

        return ['status'=>'ok','order_id'=>$order->id];
    }

@rezajahangir


سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

چرا فیلد total_price رو برابر با تایپ BigInteger قرار دادی؟!
معمولا من برای اینکار از تایپ float استفاده میکنم!


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

@juza66
چون حس کردم عدد بزرگی میره توش مخصوصا به ریال که باشه مبلغ ولی خب اره باید float بشه
تست کردم ربطی به خطام نداشت ولی خب در حالت کلی باید تغییر کنه


متین طیبی نیا
متین طیبی نیا
تخصص :backend
@MatinTayebi5 سال پیشمطرح شد
0

وقتی مشکل از fillableنیست و در قسمت create مشکل نداشتی شاید مشکل از ویو باشه ویو یک بار چک کن ،
کد createو update یک چکی تو دریافت requestها بکن ببین فرقشون چیه .


رضا جهانگیر
رضا جهانگیر
تخصص :Full-Stack Developer
@rezajahangir5 سال پیشمطرح شد
0

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

dd($request->all())

سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

اوکی این تابع رو بدون اینکه روی دیتاهاش تغییری بدی همون اول متد آپدیت بنویس و یا dd بگیر نتیجه رو بذارید

 $order->update($all_data);

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

@rezajahangir
متغییر all_data رو خروجی گذاشتم دیگه
all_data هم همونه فقط فیلد های اضافه داره که unset کردم و میبینید توی کد ها

@MatinTayebi داداش خط بعدش که به صورت تنها update میکنم رو دقت کن داده update میشه و داده هم درست میره
تازه من توی ویو یه تابع برای جمع آوری اطلاعات دارم و داده ی create و update به یک شیوه جمع آوری میشن چون جفتشونم توی یک صفحه هستن

من واقعا برام سواله
اصلا جدای از همه چی
آقا یه آرایه دارم key=>value که داریم میبینیم خروجی رو
سر ستون های جدولمم که مشخصه
چرا ابدیت نمیشه یکجا با هم ؟
چرا خط بعدش آبدیت کار میکنه؟
اگر داده مشکل داره ، اگر داده نمیرسه ، اگر fillable مشکل داره ک من بازم نباید بتونم ابدیت کنم
ولی با کد زیر آبدیت میشه

        $order->update([
            'total_price'=>$all_data['total_price']
        ]);

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

@juza66
$request من دارای فیلد هایی هست که توی ستون نیست
مثلا محصولاتمم توی اونه
چون وقتی میخوای ویرایش کنی باید حتما فقط ستون های جدول رو به صورت آرایه key=>value بهش بدی اگر unset نکنم ارور میده و میگه همچین ستونی وجود نداره و نمیتونم ویرایش کنم

ولی بازم مهم all_data قبل از ویرایش هست دیگه، داده ای که میره توی متد update
قبل از تغییراتش چرا مهم باشه؟


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

@rezajahangir
@juza66

خروجی request->all به شکل زیر هست

array:12 [
  "products" => array:2 [
    0 => array:6 [
      "name" => "سینی کباب 5 نفره"
      "stock" => 0
      "product_id" => 31
      "price" => 5000000
      "count" => 3
      "is_bonded" => "no"
    ]
    1 => array:6 [
      "name" => "قلیان"
      "stock" => 0
      "product_id" => 43
      "price" => 5000
      "count" => 5
      "is_bonded" => "yes"
    ]
  ]
  "created_at" => "17:26     1400/03/14"
  "delivery_type" => "presence"
  "total_price" => 15000000
  "credit_price" => 15000000
  "explain" => null
  "has_bonded" => "not_received"
  "discount" => 0
  "bonded_type" => "evidence"
  "bonded" => "fffff"
  "tax" => 0
  "payment_type" => "waiting"
]

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

@hesammousavi
مهندس لطفا مشکل رو بررسی کنید انگار باگ به نظر میاد
چرا اینطوریه اخه


سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

بنظرم چون ساختار آرایه رو کاستومایز کردی این مشکل رو داری ، این چیزی که میگی باگ حساب نمیشه!


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

من الان دقت کردم credit price هم همین مشکل رو داره و آبدیت نمیشه
بقیه موارد ابدیت میشن
محدودیت تعدادی چیزی داریم؟
بقیه موارد رو تست کردم الان همه رو
فقط همین دو مورد ویرایش نمیشن


سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

برای کاستوم کردن اطلاعات میتونی از Resource در لاراول استفاده کنی، این الکوئنت به روش خودش دیتا رو آپدیت یا ایجاد میکنه.

https://laravel.com/docs/8.x/eloquent-resources


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

@juza66

ساختار ذخیره چیه؟
شما به هر شکلی به صورت آرایه هر ستون دلخواه چه یکی چه همش رو به صورت key=>value بدی به متد update نباید کار کنه؟
مگه قراره من request رو فقط بدم توی update ؟
من داده ی صحیح خودم رو چیزی که نیاز دارم رو ریختم توی all_data
حالا به هر نحوی که ریختم مهم مقدار نهایی اون آرایه هست ک صحیحه و همون مقدار وارد update میشه
چرا ارور نده؟ چرا بعد از اون دستور با همون ارایه all_data دوباره بتونم آبدیت کنم؟؟


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

@juza66
به دو شیوه ی زیر هم متغییر test رو ایجاد کردم بازم ویرایش نمیشه

        $test=[
            'created_at'=>toMilady($request->created_at),
            'delivery_type'=>$request->delivery_type,
            'total_price'=>$request->total_price,
            'credit_price'=>$request->credit_price,
            'explain'=>$request->explain,
            'has_bonded'=>$request->has_bonded,
            'discount'=>$request->discount,
            'bonded'=>$request->bonded,
            'tax'=>$request->tax,
            'payment_type'=>$request->payment_type,
            'customer_id'=>$request->customer_id,
            'changed'=>'yes',
            'shift_history_id'=> $shiftHistory->shift()->id
        ];

//        foreach ($all_data as $key=>$value){
//            $test["$key"]=$value;
//        }

        if($request->customer_id){
            $order->update($test);
        }else if($request->newCustomer) {
            $customer=Customer::create($request->newCustomer);
            $test['customer_id']=$customer->id;
            $order->update($test);
        }

سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

شما این دوفلید رو به استرینگ تبدیل کن و تست کن

            $table->unsignedBigInteger('total_price');
            $table->unsignedInteger('credit_price')->default(0);

بنظرم شاید دلیلش همین دو تایپ فیلدهاتون (BigInteger و Integer) باشه اگر همه آپدیت میشن بجز اینا!


سیدعلی موسوی
سیدعلی موسوی
تخصص :سی شارپ و پی اچ پی
@juza665 سال پیشمطرح شد
0

الان ساختار آرایه رو نگاه کردم درست بود

array:12 [
  "created_at" => "2021-05-26 23:16"
  "delivery_type" => "presence"
  "total_price" => 6500000
  "credit_price" => 6500000
  "explain" => null
  "has_bonded" => "no"
  "discount" => 0
  "bonded" => 0
  "tax" => 0
  "payment_type" => "waiting"
  "changed" => "yes"
  "shift_history_id" => 3
]

، من فکر کردم داری ساختار تو در تو میسازی اول که products رو دیدم

array:12 [
  "products" => array:2 [
    0 => array:6 [
      "name" => "سینی کباب 5 نفره"
      "stock" => 0
      "product_id" => 31
      "price" => 5000000
      "count" => 3
      "is_bonded" => "no"
    ]
    1 => array:6 [
      "name" => "قلیان"
      "stock" => 0
      "product_id" => 43
      "price" => 5000
      "count" => 5
      "is_bonded" => "yes"
    ]
  ]
  "created_at" => "17:26     1400/03/14"
  "delivery_type" => "presence"
  "total_price" => 15000000
  "credit_price" => 15000000
  "explain" => null
  "has_bonded" => "not_received"
  "discount" => 0
  "bonded_type" => "evidence"
  "bonded" => "fffff"
  "tax" => 0
  "payment_type" => "waiting"
]

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

@juza66
نه تو در تو نمیسازم
شما و دوست دیگه گفتید بدون تغییر بده ببینیم چطوریه داده ی اصلی واسه همین فرستادم اونو
وگرنه فیلد اضاف اگر داشته باشه آرایه خطا میده اصلا هیچی ویرایش نمیکنه


رضا جهانگیر
رضا جهانگیر
تخصص :Full-Stack Developer
@rezajahangir5 سال پیشمطرح شد
0

یعنی شما کدوتون رو به صورت زیر نوشتید؟

public function update(Request $request, Order $order)
{
    dd($request()->all());
}

صفحه 1 از 2

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

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