【问题标题】:Laravel - restructuring array for easy sync of many-to-many with additional pivot dataLaravel - 重组数组以轻松同步多对多与其他数据透视表
【发布时间】:2020-11-04 02:06:00
【问题描述】:

我创建了一个感觉很笨重的解决方案来重组数据数组,以便将其传递给 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);

有更简单的方法吗?

【问题讨论】:

    标签: php laravel laravel-6


    【解决方案1】:

    你的方法对我来说似乎很好。如果你想挑剔,你可以使用以下方法少做一次迭代:

    $sync = array_reduce($request->input('papers'), function ($sync, $paper) {
        $id = $paper['id'];
        $sync[$id] = [ 'qty_required' => $paper['pivot']['qty_required'] ];
    
        return $sync;
    }, []);
    

    【讨论】:

    • 谢谢,很高兴知道我没有做任何愚蠢的事情!将看看array_reduce。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2019-03-25
    • 2018-09-23
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多