سلام. خوب اول از همه برای درک بهتر از سوالم یه توضیحاتی بدم. من به این شکل عمل کردم که تو متد payment میاد و id محصول و quantity و colorid از Cart میگره و توسط متد mapWithKeys پیمایش میشن و در نهایت در جدول orderproduct ذخیره میشن. و وقتی دوتا محصول متفاوت به سبد خرید اضافه و پرداخت میشه به ازایه هر محصول میاد و یک سطر جدیدکه شامل(quantity و productid و colorid و orderid ) در جدول orderproduct اضافه میکنه. خوب تا این جا مشکلی نیست و اکی هست. اما وقتی از یک محصول دو تا رنگ متفاوت به سبد خرید اضافه می کنم و پرداخت می کنم تو جدول orderproduct یک ردیف ثبت میشه در صورتی که دوتا رنگ متفاوت از یک محصول انتخاب شده. حالا میخام در جدول orderproduct به ازایه هر color متفاوت یک ردیف در جدول ثبت بشه تا مشخص بشه که کاربر از یک محصول کدوم رنگ هارو سفارش داده.
امید وارم منظورمو درست رسونده باشم.
اینم کد من:
public function payment()
{
$post = Post::find(session('post_id'));
$cart = Cart::all();
if($cart->count()){
$price = $cart->sum(function($cart) {
return $cart['discount_percent'] == 0
? $cart['price'] * $cart['quantity']
: ($cart['price'] - ($cart['price'] * $cart['discount_percent'] )) * $cart['quantity'];
});
$total_price = $price + $post->price;
$color = $cart->pluck('color');
$orderItems = $cart->mapWithKeys(function($cart) {
return [
$cart['product']->id => [ 'quantity' => $cart['quantity'], 'color_id' => $cart['color']]
];
});
//dd($color);
$order = auth()->user()->orders()->create([
'status' => 'unpaid',
'price' => $total_price,
'shipping_id' => session('shipping_id')
]);
$order->products()->attach($orderItems);
خوب به عنوان قدم اول من اومدم و توسط متد pluck ای دی رنگ هایی که برای هر محصول در سبد خرید ثبت شده برگردوندم. اما نمیدونم چجوری این id رنگ هارو به متد mapWithKeys اضافه کنم که اگر id محصولات هم یکی بود بر اساس رنگ بیاد و سطر جدید در جدول ایجاد کنه.
اینم خروجی $color = $cart->pluck('color');
Illuminate\Support\Collection {#1437 ▼
#items: array:2 [▼
0 => "2"
1 => "3"
]
}
اینجا نیازی به mapwithkey وجود نداره تا جایی که میبینم ولی کد زیر رو تست کن و خروجی بعد orderitem رو ببین
$orderItems = $cart->mapWithKeys(function($cart) {
return [
$cart['id'] => ['product_id'=>$cart['product']->id,'quantity' => $cart['quantity'], 'color_id' => $cart['color']]
];
});
در مرحله ی بعد به جاش کد زیر رو بنویس و خروجیش رو بگیر
$orderItems=[];
foreach ($cart as $item){
$orderItems[]=[
'product_id'=>$item['product']->id,
'color_id'=>$item['color'],
'quantity'=>$item['quantity']
];
}
در هر دو حالت ثبت رو هم تست کن ببین کار میکنه برات یا نه
@salar.mohammad2013
خروجی $cart :
Illuminate\Support\Collection {#1455 ▼
#items: array:2 [▼
"xFnIiNEESP" => array:6 [▼
"quantity" => 1
"color" => "1"
"price" => 5210000
"id" => "xFnIiNEESP"
"discount_percent" => 0
"product" => App\Product {#1461 ▶}
]
"mXnQ4FMc6A" => array:6 [▼
"quantity" => 1
"color" => "2"
"price" => 5200000
"id" => "mXnQ4FMc6A"
"discount_percent" => 0
"product" => App\Product {#1464 ▶}
]
]
}
خروجی $orderItems
Illuminate\Support\Collection {#1446 ▼
#items: array:1 [▼
0 => array:3 [▼
"product_id" => 1
"quantity" => 1
"color_id" => "2"
]
]
}
اینجا نیازی به mapwithkey وجود نداره تا جایی که میبینم ولی کد زیر رو تست کن و خروجی بعد orderitem رو ببین
$orderItems = $cart->mapWithKeys(function($cart) {
return [
$cart['id'] => ['product_id'=>$cart['product']->id,'quantity' => $cart['quantity'], 'color_id' => $cart['color']]
];
});
در مرحله ی بعد به جاش کد زیر رو بنویس و خروجیش رو بگیر
$orderItems=[];
foreach ($cart as $item){
$orderItems[]=[
'product_id'=>$item['product']->id,
'color_id'=>$item['color'],
'quantity'=>$item['quantity']
];
}
در هر دو حالت ثبت رو هم تست کن ببین کار میکنه برات یا نه
@salar.mohammad2013
ممنون با این روش حل شد:
$orderItems = $cart->mapWithKeys(function($cart) {
return [
$cart['id'] => ['product_id'=>$cart['product']->id,'quantity' => $cart['quantity'], 'color_id' => $cart['color']]
];
});
فقط خودم گیج شدم که چی شد؟؟ میشه یه توضیح بدین؟
mapwithkey کاری که میکنه بهت امکان این رو میده که برای داده های خودت index به صورت نام یا همون کلید قرار بری
یه جور حلقه هست و بر اون اساس مرتب میکنه داده ها رو
به اضای هر آیتمی که داخل کارتت داری مثل forech میاد تغییری که میخوایی بدی رو برات انجام میده
نیازی به استفادش نداشتی حالا اون تیکه کد دومی هم که برات فرستادم احتمال زیاد باید کار کنه
اون رو که ببینی یکم درک میکنی کار اینو
توی حالت دومی که نوشتم اندیس هر بخش اون ارایه اعداد هست از صفر شروع میشه
ولی در حالت اول اندیسش ایدی اون کارتی هست که به صورت رندوم تولید کردیش هر بار
داخل سایت لاراول مثال بهتری برات اورده ک میتونی ببینی استفادشو
برای اینجا که تو استفاده کردی نیاز نمیشه این متد
mapwithkey در سایت لاراول
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟