محمد رضا
3 سال پیش توسط محمد رضا مطرح شد
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.mohammad2013 3 سال پیش مطرح شد
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
@rezajahangir 3 سال پیش مطرح شد
0

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


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش آپدیت شد
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


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

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


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

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


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 3 سال پیش مطرح شد
0

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


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

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

dd($request->all())

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

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

 $order->update($all_data);

محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
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.mohammad2013 3 سال پیش مطرح شد
0

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

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


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
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.mohammad2013 3 سال پیش مطرح شد
0

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
0

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


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

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
0

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

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


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

@juza66

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


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
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);
        }

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
0

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

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

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
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.mohammad2013 3 سال پیش مطرح شد
0

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


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

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

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

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

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