Laravel API,在一个POST请求中传递多个对象的正确方法

时间:2018-10-08 09:25:39

标签: javascript php laravel api-design

我正在使用Laravel构建API。

在此API中,我使用两个模型,Order模型和Product模型。

一个订单可以有很多产品。为了建立这种关系,我制作了3张桌子。

以下是表格:

订单

Field       Type  
id          INT
user_id     INT
created_at  TIMESTAMP
updated_at  TIMESTAMP

产品

Field       Type  
id          INT
name        VARCHAR
price       DECIMAL
created_at  TIMESTAMP
updated_at  TIMESTAMP

order_items

Field       Type  
id          INT
order_id    INT
product_id  INT
quantity    INT
created_at  TIMESTAMP
updated_at  TIMESTAMP

问题是,如果API客户端具有订单页面(或者您可以说购物车页面),则当用户提交购物车表单时,客户端会将多个订单商品(产品)发布到服务器,知道这一点,

  1. 我们如何将多个订单商品(产品)放入AJAX JSON数据中?
  2. 如果我们使用的是REST,哪种路由URL适用于这种情况?
  3. 我们如何处理控制器中包含多个订单项的json数据?

3 个答案:

答案 0 :(得分:2)

所以根据您的问题。 以下json将起作用。 json内将有一个订单数组,它将具有多个订单,如下所示:

{
    "user_id": 1
    "orders": [
        {"product_name": "Whatever1 is selected", "quantity": 1},
        {"product_name": "Whatever2 is selected", "quantity": 2},
        {"product_name": "Whatever3 is selected", "quantity": 3},
        ],
}

然后在服务器端:

public function store(Request $request)
{
 //  after validating this you can use foreach to parse the the json
   foreach($request->orders as order)
   {
     //suposse you have orders table which has user id
      Order::create([
        "product_name" => $order['product_name'],
        "quantity"        => $order['quantity'],
        "user_id"      => $request->user_id  // since this is just json object not an jsonarray
      ]);
   }
}

如果您正在使用Laravel Passport,则无需在json中指定user_id。在这种情况下,您的json就像:

  {
        "orders": [
            {"product_name": "Whatever1 is selected", "quantity": 1},
            {"product_name": "Whatever2 is selected", "quantity": 2},
            {"product_name": "Whatever3 is selected", "quantity": 3},
            ],
    }

然后在控制器的服务器端:

public function store(Request $request)
{
 //  after validating this you can use foreach to parse the the json
   foreach($request->orders as order)
   {
     //suposse you have orders table which has user id
      Order::create([
        "product_name" => $order['product_name'],
        "quantity"        => $order['quantity'],
        "user_id"      => Auth::id()  // since you are using passport
      ]);
   }
}

在api.php文件内部进行路由:

Route::post('user/order','OrderController@store');

// if using Laravel Passport
Route::post('user/order','OrderController@store')->middleware('auth:api');

这是如何使用护照而不使用护照包裹将同一用户的多个订单存储在json中的方法。

注意:您可以根据自己的设计更改json键名。 这只是一个示例,让您了解如何使用它。

答案 1 :(得分:1)

当涉及带有产品API的订单时,我总是问自己:“ Shopify会做什么?” (WWSD)

此链接记录了他们的订单api,并向您展示了如何在json中发布带有商品的订单以及返回的json响应。

https://help.shopify.com/en/api/reference/orders/order#create

该页面还包含关闭,取消,更新,删除等示例。

但是请注意,除了Order和Product之外,API后面还有很多表正在更新。

答案 2 :(得分:0)

这是我的做法。

def lab_print ():
        row_value = 5
        for i in month_list:   #iterating through the list, creating label
            row_value = row_value + 1
            iLabel = Label(akhilGui, text= str(i),
                                fg="#113B53",font = "Helvetica  12 bold ", justify='right')
            lab_list.append(iLabel)
            iLabel.grid(row = row_value, column=0, pady=2, padx=15, sticky= W)