Laravel - 重组数组以轻松同步多对多与其他数据透视数据
Laravel - restructuring array for easy sync of many-to-many with additional pivot data
我创建了一个感觉很笨重的解决方案来重组数据数组,以便将其传递给 sync() 以更新多对多关系与数据透视表中的附加数据 table 和想知道是否有人可以建议更简单的方法。
我有一个来自请求的数组,这是一个相关的摘录:
"papers" => [
0 => [
"id" => 2
"code" => "123-321-888"
"name" => "Pop out"
"pivot" => [
"job_id" => 46
"paper_id" => 2
"qty_required" => 500
]
]
1 => [
"id" => 1
"code" => "444-666-999"
"name" => "Premium pro"
"pivot" => [
"job_id" => 46
"paper_id" => 1
"qty_required" => 1000
]
]
]
为了轻松同步多对多关系与额外的数据透视数据,需要将其重组为:
[
paper[id] => [
'qty_required' => paper[pivot][qty_required]
]
]
上面的例子是:
[
2 => [
"qty_required" => "500"
]
1 => [
"qty_required" => "1000"
]
]
我目前正在执行以下两步过程来实现此目的:
$paperUpdate = Arr::pluck($request->input('papers'), 'pivot.qty_required', 'id');
//output: [ 2 => 500, 1 => 1000]
foreach ($paperUpdate as $key => $value) {
$paperSync[$key]['qty_required'] = $value;
}
//output: [ 2 => [ "qty_required" => "500" ], 1 => [ "qty_required" => "1000" ]
$job->papers()->sync($paperSync);
有没有更简单的方法?
我觉得你的方法不错。如果你想挑剔,你可以使用以下方法少做一次迭代:
$sync = array_reduce($request->input('papers'), function ($sync, $paper) {
$id = $paper['id'];
$sync[$id] = [ 'qty_required' => $paper['pivot']['qty_required'] ];
return $sync;
}, []);
我创建了一个感觉很笨重的解决方案来重组数据数组,以便将其传递给 sync() 以更新多对多关系与数据透视表中的附加数据 table 和想知道是否有人可以建议更简单的方法。
我有一个来自请求的数组,这是一个相关的摘录:
"papers" => [
0 => [
"id" => 2
"code" => "123-321-888"
"name" => "Pop out"
"pivot" => [
"job_id" => 46
"paper_id" => 2
"qty_required" => 500
]
]
1 => [
"id" => 1
"code" => "444-666-999"
"name" => "Premium pro"
"pivot" => [
"job_id" => 46
"paper_id" => 1
"qty_required" => 1000
]
]
]
为了轻松同步多对多关系与额外的数据透视数据,需要将其重组为:
[
paper[id] => [
'qty_required' => paper[pivot][qty_required]
]
]
上面的例子是:
[
2 => [
"qty_required" => "500"
]
1 => [
"qty_required" => "1000"
]
]
我目前正在执行以下两步过程来实现此目的:
$paperUpdate = Arr::pluck($request->input('papers'), 'pivot.qty_required', 'id');
//output: [ 2 => 500, 1 => 1000]
foreach ($paperUpdate as $key => $value) {
$paperSync[$key]['qty_required'] = $value;
}
//output: [ 2 => [ "qty_required" => "500" ], 1 => [ "qty_required" => "1000" ]
$job->papers()->sync($paperSync);
有没有更简单的方法?
我觉得你的方法不错。如果你想挑剔,你可以使用以下方法少做一次迭代:
$sync = array_reduce($request->input('papers'), function ($sync, $paper) {
$id = $paper['id'];
$sync[$id] = [ 'qty_required' => $paper['pivot']['qty_required'] ];
return $sync;
}, []);