Laravel 值未正确存储在数组$items中

Laravel 值未正确存储在数组$items中,laravel,Laravel,我想获得每种注册类型的数量,代码如下: $registrationTypeDetails = Registration::with('participants:id,registration_type_id,registration_id')->find($regID); $type_counts = []; foreach ($registrationTypeDetails->participants as $p) { $name = $p->registratio

我想获得每种注册类型的数量,代码如下:

$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]++;
}
dd($type_计数),如果会议有两种可用的注册类型(general和plus),并且用户在注册类型为“general”的情况下注册了2名参与者,而注册类型为“plus”的情况下注册了0名参与者,则会显示:

然后我需要向API发出post请求,其中需要在请求正文中发送每个注册类型的数量,在这种情况下,只有1个注册类型“general”,数量值应为“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
      ]
    ]
  ]
]
而不仅仅是一项:

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

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
      ]
    ]
  ]
]

您需要根据注册类型名称键入项目的结果:

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],
  ];
}
更好的方法是使用注册类型的id(如果有):

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[]
即可附加到items数组。您希望按注册类型对结果进行分组

修复422验证错误

您的项是一个有效的数组,但由于它被转换为json,
1
1
将作为对象设置关键帧。要强制调整钥匙,可以执行以下操作:

// It is hacky but it re-keys the items array numerically.
$items['invoice']['items'] = array_values($list['invoice']['items']);

谢谢,它可以工作,但您能解释为什么需要这样做吗?在api post请求“422不可处理实体`响应:{”errors:[{”error:“Items元素应为数组}]}类型”中出现了一个错误。但是使用了“数组:1”[▼ "发票“=>数组:4[▼ “项目”=>数组:2[▼ 0=>数组:3[▼ “名称”=>一般“单价”=>10“数量”=>2]1=>数组:3[▼ “名称”=>加上“单价”=>0“数量”=>2]]“错误没有出现,可能问题是数组没有以索引0开头?编辑并用新的
输出更新您的问题,然后是您用于post请求的验证。谢谢,我更新了问题。这似乎是因为它以“1”而不是“0”开头。例如,对于此代码,错误不会出现。”“$i=0;foreach($registrationTypeDetails->participants as$registrationType){$items['invoice']['items'][$i]=['name'=>$registrationType->registration\U type->name,'unit\U price'=>$registrationType->registration\U type->price,'quantity'=>$type\U counts.”[$registrationType->registration_type->name],];$i++;
// It is hacky but it re-keys the items array numerically.
$items['invoice']['items'] = array_values($list['invoice']['items']);