【问题标题】: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 不,它们可以是不同的长度

标签: laravel


【解决方案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)`
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2019-08-29
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多