سلام و خسته نباشید
من یه سری اطلاعات دارم برای سفارشم که میخوام ویرایشش کنم
همه چیز ویرایش میشه تا جایی ک میبینم ب جز یک فیلد ک خیلی عجیبه برام (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
مرسی از همه ی دوستانی که مشارکت کردن
اشتباه از خود بنده بود و سهل انگاری کردم
دستور 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
اصل موضوع چیزی بود ک فرستادم براتون داده ای که به 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];
}
چرا فیلد total_price رو برابر با تایپ BigInteger قرار دادی؟!
معمولا من برای اینکار از تایپ float استفاده میکنم!
وقتی مشکل از fillable
نیست و در قسمت create
مشکل نداشتی شاید مشکل از ویو باشه ویو یک بار چک کن ،
کد create
و update
یک چکی تو دریافت request
ها بکن ببین فرقشون چیه .
اوکی این تابع رو بدون اینکه روی دیتاهاش تغییری بدی همون اول متد آپدیت بنویس و یا dd بگیر نتیجه رو بذارید
$order->update($all_data);
@rezajahangir
متغییر all_data رو خروجی گذاشتم دیگه
all_data هم همونه فقط فیلد های اضافه داره که unset کردم و میبینید توی کد ها
@MatinTayebi داداش خط بعدش که به صورت تنها update میکنم رو دقت کن داده update میشه و داده هم درست میره
تازه من توی ویو یه تابع برای جمع آوری اطلاعات دارم و داده ی create و update به یک شیوه جمع آوری میشن چون جفتشونم توی یک صفحه هستن
من واقعا برام سواله
اصلا جدای از همه چی
آقا یه آرایه دارم key=>value که داریم میبینیم خروجی رو
سر ستون های جدولمم که مشخصه
چرا ابدیت نمیشه یکجا با هم ؟
چرا خط بعدش آبدیت کار میکنه؟
اگر داده مشکل داره ، اگر داده نمیرسه ، اگر fillable مشکل داره ک من بازم نباید بتونم ابدیت کنم
ولی با کد زیر آبدیت میشه
$order->update([
'total_price'=>$all_data['total_price']
]);
@juza66
$request من دارای فیلد هایی هست که توی ستون نیست
مثلا محصولاتمم توی اونه
چون وقتی میخوای ویرایش کنی باید حتما فقط ستون های جدول رو به صورت آرایه key=>value بهش بدی اگر unset نکنم ارور میده و میگه همچین ستونی وجود نداره و نمیتونم ویرایش کنم
ولی بازم مهم all_data قبل از ویرایش هست دیگه، داده ای که میره توی متد update
قبل از تغییراتش چرا مهم باشه؟
خروجی 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"
]
بنظرم چون ساختار آرایه رو کاستومایز کردی این مشکل رو داری ، این چیزی که میگی باگ حساب نمیشه!
من الان دقت کردم credit price هم همین مشکل رو داره و آبدیت نمیشه
بقیه موارد ابدیت میشن
محدودیت تعدادی چیزی داریم؟
بقیه موارد رو تست کردم الان همه رو
فقط همین دو مورد ویرایش نمیشن
برای کاستوم کردن اطلاعات میتونی از Resource در لاراول استفاده کنی، این الکوئنت به روش خودش دیتا رو آپدیت یا ایجاد میکنه.
ساختار ذخیره چیه؟
شما به هر شکلی به صورت آرایه هر ستون دلخواه چه یکی چه همش رو به صورت key=>value بدی به متد update نباید کار کنه؟
مگه قراره من request رو فقط بدم توی update ؟
من داده ی صحیح خودم رو چیزی که نیاز دارم رو ریختم توی all_data
حالا به هر نحوی که ریختم مهم مقدار نهایی اون آرایه هست ک صحیحه و همون مقدار وارد update میشه
چرا ارور نده؟ چرا بعد از اون دستور با همون ارایه all_data دوباره بتونم آبدیت کنم؟؟
@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);
}
شما این دوفلید رو به استرینگ تبدیل کن و تست کن
$table->unsignedBigInteger('total_price');
$table->unsignedInteger('credit_price')->default(0);
بنظرم شاید دلیلش همین دو تایپ فیلدهاتون (BigInteger و Integer) باشه اگر همه آپدیت میشن بجز اینا!
الان ساختار آرایه رو نگاه کردم درست بود
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"
]
یعنی شما کدوتون رو به صورت زیر نوشتید؟
public function update(Request $request, Order $order)
{
dd($request()->all());
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟