在PHP Laravel中解析和循环一个javascript对象数组



我想把这个对象数组解析成PHP可以读取的东西,这样我就可以把它保存到数据库中。这是一组对象,来自控制台日志,是发送到我的axios帖子的内容:

"user_id": 4,
Array [
Object {
"cartID": "33S",
"id": 33,
"image": "http://myurl/uploads/5db88f40c857dtest.jpg",
"name": "testt",
"quantity": 1,
"size": "S",
},
Object {
"cartID": "32S",
"id": 32,
"image": "https://dummyimage.com/600x400/000/fff",
"name": "pottery",
"quantity": 1,
"size": "S",
},
Object {
"cartID": "34S",
"id": 34,
"image": "http://myurl/uploads/5db8918fac485test.jpg",
"name": "Nature",
"quantity": 1,
"size": "S",
},
]

在PHP上我有:

public static function AddOrder(Request $request)
{
$add = DB::table('Orders')->insert([
'user' => $request->user_id
]);
$items = json_decode($request->cartItems, true);
foreach ($items as $item) {
DB::table('order_items')->insert([
'order_id' => DB::table('orders')->latest('user_id')->first(),
'product'  => $item->id,
'quantity' => $item->quantity,
'size'     => $item->size
]);
}
return $add;
}

每当我尝试这样做时,我总是会得到一个错误cartItems不能为null。我甚至试过在运行AddOrder中的任何内容之前只返回cartItems,但它只是说它为空。我正在使用axios发送它像:

axios.post('http://myurl/api/orders/create', {
cartItems: cart,
user_id: user.id
})
.then(res => {
console.log(res.data)
})
.catch(err => {
console.log(err)
})

我还尝试了另一种方法

let newReq = {
user_id: 1
};
for(let i = 0; i < cart.length; i++) {
Object.keys(cart[i]).forEach((key) => {
let newkey = 'cartItems[' + i + '][' + key + ']';
newReq[newkey] = cart[i][key];
});
}

发送后,在Laravel上回复我使用的客户端:

return response()->json($request->all());

我得到

Object {
"cartItems[0][cartID]": "33S",
"cartItems[0][id]": 33,
"cartItems[0][image]": "http://trayvonnorthern.com/Edgewood-API/public/uploads/5db88f40c857dtest.jpg",
"cartItems[0][name]": "testt",
"cartItems[0][quantity]": 1,
"cartItems[0][size]": "S",
"cartItems[1][cartID]": "32S",
"cartItems[1][id]": 32,
"cartItems[1][image]": "https://dummyimage.com/600x400/000/fff",
"cartItems[1][name]": "pottery",
"cartItems[1][quantity]": 1,
"cartItems[1][size]": "S",
"cartItems[2][cartID]": "34S",
"cartItems[2][id]": 34,
"cartItems[2][image]": "http://trayvonnorthern.com/Edgewood-API/public/uploads/5db8918fac485test.jpg",
"cartItems[2][name]": "Nature",
"cartItems[2][quantity]": 1,
"cartItems[2][size]": "S",
"user_id": 1,
}

当我做时

return response()->json($request->cartItems);

它什么也不回。

Axios似乎不接受我在之前的回答中使用的请求格式,所以我删除了它。然而,它似乎接受这种格式的请求(这就是你最初使用的格式。我的错误,真的(:

let request = {
user_id: 1,
cartItems: [
{
"cartID": "33S",
"id": 33,
"image": "http://myurl/uploads/5db88f40c857dtest.jpg",
"name": "testt",
"quantity": 1,
"size": "S",
},
{
"cartID": "32S",
"id": 32,
"image": "https://dummyimage.com/600x400/000/fff",
"name": "pottery",
"quantity": 1,
"size": "S",
},
{
"cartID": "34S",
"id": 34,
"image": "http://myurl/uploads/5db8918fac485test.jpg",
"name": "Nature",
"quantity": 1,
"size": "S",
}
]
}

然后,您可以使用axios.post发送request对象。要在后端访问它,请使用$items = $request->cartItems。没有必要解析它。

使用Axios向Laravel API发送对象或数组时,请尝试将有效负载转换为JSON字符串。

在你的客户端上试试这个

const your_payload_object = { user_id : 1, cart_items:[{id:1},{id:2},{id:3}] };
axios.post(url, JSON.stringify(your_payload_object), {"Content-type": "application/json"})

你可以访问类似的laravel上的数据

$userId = $reequest->user_id;
$cart_items = $request->cart_items;
// Which will be an array as given below
//
// $cart_items = 
//      [ 
//         ["id" => 1], 
//         ["id" => 2], 
//         ["id" => 3] 
//      ];

最新更新