使用pivot插入多对多时存在Laravel问题



所以注意力和服务/程序之间是多对多的关系。

病人有许多注意,注意属于病人。

当我开始注意程序(多对多关系)时,问题就来了

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

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

应该返回一个值-键对,其中数组键是过程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之一

如何使集合返回过程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的工作,因为将有更少的记录需要处理。

最新更新