如何同时保存多个不同数量的数据?
Posted
技术标签:
【中文标题】如何同时保存多个不同数量的数据?【英文标题】:How to save multiple data with different number of data at same time? 【发布时间】:2020-02-27 12:12:30 【问题描述】:我有 cv 表、用户表和共享表。 共享表结构 shareto_id,cv_id,user_id
可以有任意数量的 shareto_id 和 cv_id。 假设我想保存(1)shareto_id 和(2)cv_id。 但它只在数据库中保存一个数据。 这些是我已经尝试过的代码。
$cv_id = explode(",",$cvids);
$shareto_id = explode(",",$sharetoids);
$cvlength = count($cv_id);
$sharetolength = count($shareto_id);
for($i=0; $i<$cvlength; $i++)
for($j=0; $j<$sharetolength; $j++)
$data['cv_id'] = $cv_id[$i];
$data['user_id'] = $request->user_id;
$data['shareto_id']= $shareto_id[$j];
Share::create($data);
【问题讨论】:
我想你要问的是,为什么当你创建一个共享共享时只设置了 user_id? @MichaelMano 我想同时在数据库中保存多个数据,但只保存一个。 你的 CV id 和 Share id 长度一样吗? @MichaelMano 不,它们可以是不同的长度 【参考方案1】:如果我正确理解了您的问题,您应该将create
移动到循环中:
for ($i = 0; $i < $cvlength; $i++)
for ($j = 0; $j < $sharetolength; $j++)
$data['cv_id'] = $cv_id[$i];
$data['user_id'] = $request->user_id;
$data['shareto_id'] = $shareto_id[$j];
Share::create($data);
或使用此处所述的insert
How to insert multiple rows from a single query using eloquent/fluent
【讨论】:
是的,但是如果您有大量数据,最好使用@lagbox 的答案,因为insert
将查询数据库一次,create
每条数据查询一次【参考方案2】:
$data
只是一个包含 3 个元素的数组。该循环的每次迭代您都重新分配 $data['cv_id']
、$data['user_id']
、$data['shareto_id']
,因此之前的值消失了。
您需要通过创建新的元素数组来保留以前的值以添加到主集合中:
$data = [];
for (...)
for (...)
$data[] = [
'cv_id' => $cv_id[$i],
'user_id' => $request->user_id,
'shareto_id' => $shareto_id[$j],
];
Eloquent Builder 上的 create
方法用于创建 1 个新模型实例,并且不会多次保存。
如果您想进行批量插入并部分绕过 Eloquent,您可以使用 Query Builder 的 insert
方法。
Share::insert($data);
【讨论】:
【参考方案3】:确保循环格式化数组中的数据,如下所示
$data = array(
array('cv_id'=> 2, 'user_id'=> 1, 'shareto_id'=> 4),
array('cv_id'=> 5, 'user_id'=> 3, 'shareto_id'=> 9),
//...
);
Model::insert($data);
所以在你的情况下,代码应该是这样的
$data = [];
for($i=0; $i<$cvlength; $i++)
for($j=0; $j<$sharetolength; $j++)
$data[] = [
'cv_id' => $cv_id[$i],
'user_id' => $request->user_id,
'shareto_id'=> $shareto_id[$j]
];
Share::insert($data);
【讨论】:
【参考方案4】:不要使用循环插入新记录,我们可以像这样构建原始插入查询
insert into "Table_name" ('cv_id','user_id','shareto_id')VALUES (cv_id_value_1, user_id_value_1, shareto_id_1) (cv_id_value_2, user_id_value_2, shareto_id_2)`
只需一个查询即可批量插入
【讨论】:
以上是关于如何同时保存多个不同数量的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Azure 数据工厂内拥有不同数量客户的不同环境中使用相同的管道?