راکت
حل شده

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

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

ثبت پرسش جدید

پاسخ‌ها

22
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

بهترین پاسخ

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

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

اصل موضوع چیزی بود ک فرستادم براتون داده ای که به 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

تخصص: سی شارپ و پی اچ پی

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

متین طیبی نیا
متین طیبی نیا
@MatinTayebi

تخصص: backend

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

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

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

dd($request->all())
سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

 $order->update($all_data);
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

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

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

        $order->update([
            'total_price'=>$all_data['total_price']
        ]);
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

@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"
]
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

@juza66

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

محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

@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

تخصص: سی شارپ و پی اچ پی

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

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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"
]
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

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

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

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

public function update(Request $request, Order $order)
{
    dd($request()->all());
}
صفحه 1 از 2

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

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