javascript - Laravel API,一次POST请求中传递多个对象的正确方式

标签 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

订单商品

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. 我们如何处理 Controller 中包含多个订单项的 json 数据?

最佳答案

所以根据你的问题。 以下 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},
            ],
    }

然后在你 Controller 的服务器端:

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');

这就是您如何使用 passport 在 JSON 中存储同一用户的多个订单,而无需 passport 包。

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

关于javascript - Laravel API,一次POST请求中传递多个对象的正确方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52699166/

相关文章:

javascript - JQuery:使用 () => {} 和 function() 语法,后者有效

php - 使用 HTML 表单隐藏元素传递数组

php - 检查条目是否属于数据库

php - Laravel队列继续为作业处理多次

laravel - 如何在 Laravel 中定义默认回退路由?

javascript - 自定义 ArcGIS GraphicsLayer (JavaScript)

javascript - Adobe InDesign JSX : get Data Merge Link or File

laravel - 内部服务器错误 : Laravel CentOs 7

javascript - 如何强制广告在ajax加载的页面上显示? (站长)

php - 路由到 CodeIgniter 中的多个子文件夹