Laravel API - правильный способ передать несколько объектов в одном запросе POST - PullRequest
0 голосов
/ 08 октября 2018

Я создаю API с использованием Laravel.

В этом 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. Какой URL-адрес маршрута подходит для этого сценария, если мы используем REST?
  3. Как мы обрабатываем данные json, которые содержат несколько элементов заказа в контроллере?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Когда дело доходит до API заказов с продуктами, я всегда спрашиваю себя: «Что бы сделал Shopify?»(WWSD)

Эта ссылка документирует их API-интерфейсы и показывает, как разместить заказ с продуктами в формате json, и ответ json, который вы получите.

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

На странице также есть примеры закрытия, отмены, обновления, удаления и т. Д.

Но имейте в виду, помимо API и Продукта за API обновляется множество таблиц.

0 голосов
/ 08 октября 2018

Итак, основываясь на ваших вопросах. Будет работать следующий 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, вам не нужно указывать user_id в json.в этом случае ваш 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 в соответствии с вашим дизайном.просто пример, чтобы показать вам, как вы можете его использовать.

...