猿问

Laravel - 重组数组,以便轻松同步多对多与附加枢轴数据

我创建了一个感觉像是笨重的解决方案来重组数据数组,以便将其传递给sync()以更新与数据透视表中的附加数据的多对多关系,并想知道是否有人可以建议一种更简单的方法。


我有一个来自请求的数组,这是相关的摘录:


"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);

有更简单的方法吗?


月关宝盒
浏览 151回答 1
1回答

神不在的星期二

你的方法对我来说似乎很好。如果你想挑剔,你可以使用以下方法少做一次迭代:$sync = array_reduce($request->input('papers'), function ($sync, $paper) {    $id = $paper['id'];    $sync[$id] = [ 'qty_required' => $paper['pivot']['qty_required'] ];    return $sync;}, []);
随时随地看视频慕课网APP
我要回答