【问题标题】:Parsing and looping through a javascript array of objects in PHP Laravel在 PHP Laravel 中解析和循环对象的 javascript 数组
【发布时间】:2020-02-25 19:19:04
【问题描述】:

我想将这个对象数组解析为 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 can't be 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);

它什么也不返回。

【问题讨论】:

  • 当你使用$request-&gt;user_id 时它也是空的吗?请在您的问题中添加dd($request-&gt;all());
  • 是的,当我返回 $request 时,我只得到一个空数组
  • 如Jean所说,请在AddOrder的开头做dd($request-&gt;all());,并确保您已从axios请求中获得任何数据
  • 我使用 laravel 作为 REST API。不只是向我的客户端返回响应会达到同样的效果吗?
  • dd 返回生成的 HTML 页面,其中包含可读格式的响应内容。在您的情况下,返回 response()-&gt;json($request-&gt;all()) 就足够了

标签: javascript php json laravel javascript-objects


【解决方案1】:

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-&gt;cartItems。无需解析。

【讨论】:

  • 没问题。这现在允许我获取 cartItems。惊人的!现在还有一个问题。我尝试了一个看起来像这样的 foreach: foreach($cartItems as $cartItem) { return response()->json($item->name)} 但出现错误。
  • 仅返回 $item 会返回单个对象,但无法访问属性。抱歉,这是我第一次尝试使用客户端购物车并将其转换为 PHP 数组
  • @MikeShiv 您是否使用对象表示法或数组表示法访问项目属性?
  • 对象符号。因为我在一个移动应用程序上,所以我只是收到一个 500 错误,所以很难说,但是当我尝试使用邮递员时,我只是得到一个 foreach 的无效参数
  • @MikeShiv 尝试使用这样的数组表示法:$size = $request-&gt;cartItems[0]['size'];。 Laravel 不会将您的对象解析回对象,而是解析为键控数组。
【解决方案2】:

使用 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] 
//      ];

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2021-11-29
    • 2016-10-28
    • 2018-07-28
    • 2014-07-12
    • 2012-01-11
    • 2015-03-26
    • 2015-10-24
    相关资源
    最近更新 更多