如何同时保存多个不同数量的数据?

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)`

只需一个查询即可批量插入

【讨论】:

以上是关于如何同时保存多个不同数量的数据?的主要内容,如果未能解决你的问题,请参考以下文章

SQL聚合中同一列内的多个值的不同计数

如何在 Azure 数据工厂内拥有不同数量客户的不同环境中使用相同的管道?

在 Shopify 中,如何通过 url 将不同数量的多个产品添加到购物车

当用户有不同数量的输入时如何考虑数据库设计

mysql如何查询一个表里,同一字段不同条件数据数量?

如何限制ssh用户同时登陆的数量