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