Laravel 使用数据透视表插入多对多时出现问题

Laravel issue when inserting many to many with pivot

所以我在注意力和services/procedures之间有一个多对多的关系。

一个病人有很多关注点,关注点属于一个病人。

当我播种注意力程序(多对多关系)时出现问题

我根据 Laravel 文档转换数据,我正在使用集合。

$procedures = Procedure::all()->mapWithKeys(function ($procedure,$key) {
            return [$procedure['id'] => [
                'price' => $procedure['price'],
                'price_USD' => $procedure['price_USD'],
                'amount' => rand(1, 10),
            ]];
        });

那应该 return 我是一个值键对,其中数组键是过程 ID。

但是当我尝试将程序附加到注意事项时。

$attention->procedures()->attach($procedures->random(rand(1,10))->all());

迁移引发错误。

调试了一段时间,ray抛出的是这个

程序:

array:3 [▼
  0 => array:3 [▼
    "price" => 439.39
    "price_USD" => 17.87
    "amount" => 1
  ]
  1 => array:3 [▼
    "price" => 287.39
    "price_USD" => 11.69
    "amount" => 4
  ]
  2 => array:3 [▼
    "price" => 0.68
    "price_USD" => 0.03
    "amount" => 8
  ]
]

查询:

insert into
  `attention_procedure` (
    `amount`,
    `attention_id`,
    `price`,
    `price_USD`,
    `procedure_id`
  )
values
  (8, 1, 651.72, 26.51, 0),
  (10, 1, 403.18, 16.4, 1),
  (10, 1, 629.08, 25.59, 2),
  (10, 1, 930.84, 37.86, 3),
  (6, 1, 330.7, 13.45, 4),
  (5, 1, 629.53, 25.61, 5),
  (2, 1, 241.81, 9.84, 6),
  (10, 1, 354.68, 14.43, 7)

如您所见,它试图将 0 作为过程 ID 之一插入 ,但它不存在。

我怎样才能使集合 return 将过程 ID 作为数组键?

我认为 mapWithKeys 没问题,但它是 random,当你这样做时它只获得值:

->attach($procedures->random(rand(1,10))->all())

尝试在查询中获取一些随机记录并映射它们:

$procedures = Procedure::inRandomOrder()->limit(rand(1,10))->get()
    ->mapWithKeys(function ($procedure,$key) {             
        return [$procedure['id'] => [                 
            'price' => $procedure['price'],                 
            'price_USD' => $procedure['price_USD'],                 
            'amount' => rand(1, 10),             
        ]];         
    })
    ->toArray();

然后插入:

$attention->procedures()->attach($procedures);

这样一来,您也可以减轻数据库和 php 的工作,因为要处理的记录会更少。