【问题标题】:How to fix Laravel bulk inserting records only saving first record to database如何修复 Laravel 批量插入记录仅将第一条记录保存到数据库
【发布时间】:2019-04-29 14:44:20
【问题描述】:

我正在尝试将多条记录保存到数据库。我认为从前端视图提交数组一定有问题。

首先,我的行是用 jquery 动态生成的。 我试过 var_dumping 请求,它只给了我第一行。我在每个输入字段名称中的名称中添加了 []。

我的视图中的一些输入字段

    <td width="15%">
        <select class="form-control select2 item_id" name="item_id[]" required>
            <option></option>
        </select>
    </td>
    <td width="10%">
        <select class="form-control select2 location_id" name="location_id[]"  required>
            <option></option>
        </select>
    </td>
    <td width="20%">
        <input type="text" class="form-control package" name="package[]" required>
    </td>

控制器

$receive = new Receive();
    $receive->datetime = $request->datetime;
    $receive->user_id = $request->user_id;
    $receive->truck_id = $request->truck_id;
    $receive->from = $request->from;
    $receive->condition = $request->condition;
    $receive->space = $request->space;
    dd($request->all());
    if($receive->save()) {
        $id = $receive->id;
        foreach($request->item_id as $key=>$it) {
            $data = array('receive_id'=>$id,
                          'item_id'=>$request->item_id [$key],
                          'location_id'=>$request->location_id [$key],
                          'package'=>$request->package [$key],
                          'quantity'=>$request->quantity [$key],
                          'note'=>$request->note [$key],
                           );
            ItemReceive::create($data);
        }
        return back()->with('success', 'Received Items successfully');
    }

    return back()->with('success', 'Received successfully.');

我除了将数组数据保存到数据库中,但只有第一行进入后端。

【问题讨论】:

  • 这里的重要部分是通过http发送的数据。使用浏览器的控制台查看您发送的内容,然后断言出现了什么问题。显然,您没有发送数组。
  • @Mjh 如果他不发送数组,他将无法使用foreach 循环。我建议使用dd($request-&gt;all()); 来查看控制器正在接收的确切内容。
  • @ChinLeung 我们不知道他在发送什么,也不知道他是否收到任何警告。这一切都在猜测,看到实际上没有关于正在发送的数据的信息。
  • @Mjh 好吧,他提到第一条记录已正确保存在数据库中,因此他必须收到一些数据。由于控制器在$request-&gt;item_id中循环,所以那一定是一个数组...
  • @Mjh 我试过 dd()。是的,他们作为数组发布,但在数组中我可以看到只有一行通过。像这样:'item_id'=>array:1[0]=>"4"

标签: php laravel eloquent query-builder


【解决方案1】:

我不希望在 DB 中插入单个条目,但是,我希望创建一个数组并将该数组传递给 insert,如下所示:

尝试用以下代码替换您的代码:

$now = date('Y-m-d H:i:s');
//you could also try
//$now = Carbon::now();
$arr = [];
foreach($request->item_id as $key=>$it) {
    $arr[] = array('receive_id'=>$id,
                  'item_id'=>$request->item_id[$key],
                  'location_id'=>$request->location_id[$key],
                  'package'=>$request->package[$key],
                  'quantity'=>$request->quantity[$key],
                  'note'=>$request->note[$key],
                  'created_at' => $now,
                  'updated_at' => $now
                );

}

ItemReceive::create($arr);

//make sure you have assigned a correct key in `$fillable` array in your `ItemReceive` model.

编辑:1

尝试添加multiple进行选择:

<select multiple name="bdhdh">
    <option>hdjdjd</option>
</select>

【讨论】:

  • 你为什么要像这样批量插入,而不是一个一个地插入记录,包装在一个事务中?
  • 你能粘贴你的完整控制器吗?
  • @dexter 是的。我已经更新了问题的详细信息。提前致谢,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2020-10-31
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多