значения неправильно хранятся в массиве $ items - PullRequest
0 голосов
/ 04 июля 2018

Я хочу получить количество каждого типа регистрации с кодом ниже:

$registrationTypeDetails = Registration::with('participants:id,registration_type_id,registration_id')->find($regID);

$type_counts = [];
foreach ($registrationTypeDetails->participants as $p) {
    $name = $p->registration_type->name;
    if (!isset($type_counts[$name])) {
        $type_counts[$name] = 0;
    }
    $type_counts[$name]++;
}

Дд ($ type_counts), если в конференции доступно 2 типа регистрации (общая и плюс), и пользователь выполняет регистрацию с 2 участниками типа регистрации «общая» и 0 участниками с типом регистрации «плюс». показывает:

 array:2 [▼
      "general" => 2
    ]

Затем мне нужно отправить запрос в API, где необходимо отправить в теле запроса количество каждого типа регистрации, в этом случае есть только 1 тип регистрации «общий», и значение для количества должно быть « 2" .

Итак, у меня есть этот код под кодом выше для создания массива:

foreach ($registrationTypeDetails->participants as $registrationType) {
  $items['invoice']['items'][] = [
      'name' => $registrationType->registration_type->name,
      'unit_price' => $registrationType->registration_type->price,
      'quantity' => $type_counts[$registrationType->registration_type->name],
  ];
}
$create = $client->request('POST', 'https://...', [
    'query' => ['api_key' => '...'], 'json' => $items,
]);

Но тогда выходной массив будет:

array:1 [▼
  "invoice" => array:4 [▼
    "client" => array:7 [▶]
    "items" => array:2 [▼
      0 => array:5 [▼
        "name" => "general"
        "unit_price" => 10
        "quantity" => 2
      ]
      1 => array:5 [▼
        "name" => "general"
        "unit_price" => 10
        "quantity" => 2
      ]
    ]
  ]
]

Вместо 1 предмета:

array:1 [▼
  "invoice" => array:4 [▼
    "client" => array:7 [▶]
    "items" => array:2 [▼
      0 => array:5 [▼
        "name" => "general"
        "unit_price" => 10
        "quantity" => 2
      ]
    ]
  ]
]

$ показывает предметы:

array:1 [▼
  "invoice" => array:4 [▼

    "items" => array:2 [▼
      1 => array:5 [▼
        "name" => "general"
        "unit_price" => 10
        "quantity" => 2
      ]
      2 => array:5 [▼
        "name" => "plus"
        "unit_price" => 0
        "quantity" => 2
      ]
    ]
  ]
]

1 Ответ

0 голосов
/ 04 июля 2018

Вам нужно будет ввести результаты пунктов в соответствии с именем типа регистрации:

foreach ($registrationTypeDetails->participants as $registrationType) {
  $items['invoice']['items'][$registrationType->registration_type->name] = [
      'name' => $registrationType->registration_type->name,
      'unit_price' => $registrationType->registration_type->price,
      'quantity' => $type_counts[$registrationType->registration_type->name],
  ];
}

Лучше использовать идентификатор регистрационного типа, если он есть:

foreach ($registrationTypeDetails->participants as $registrationType) {
  $items['invoice']['items'][$registrationType->registration_type->id] = [
      'name' => $registrationType->registration_type->name,
      'unit_price' => $registrationType->registration_type->price,
      'quantity' => $type_counts[$registrationType->registration_type->name],
  ];
}

Пояснение

Когда вы перебираете участников, связанных с типом регистрации, у нескольких участников может быть один и тот же тип регистрации. Так что в вашем случае вам нужно сгруппировать результаты по типу регистрации. Просто добавление к items[] добавляет к массиву элементов. Вы хотите сгруппировать результаты по типу регистрации.

Исправление ошибки проверки 422

Ваши элементы являются допустимым массивом, но поскольку он переведен в json, 1 и 1 будут обозначены как объект. Для принудительной настройки клавиш вы можете сделать следующее:

// It is hacky but it re-keys the items array numerically.
$items['invoice']['items'] = array_values($list['invoice']['items']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...