【问题标题】:Updating table with multiple rows更新多行表
【发布时间】:2020-05-24 15:58:32
【问题描述】:

如何通过report_id 同时更新多行?我的库存表如下所示:

| id | report_id | product_id | shelf_quantity | display_quantity |
|----|-----------|------------|----------------|------------------|
| 1  | 2         | 12         | 1              | 5                |
| 2  | 2         | 13         | 2              | 6                |
| 3  | 2         | 14         | 3              | 23               |

我解决问题的尝试:

我的控制器:

函数更新($id, 请求$request) {

    $report = Report::find($id);
    $inputs = $request->input('display');

    $report->user_id  = $user_id;
    $report->save();

    //Updating inventory table

    $inventory = Inventory::where('report_id', $report->id)->get();
    foreach($inputs as $key => $value) {        
      $inventory->display = $request->input('display')[$key] ?: 0;
      $inventory->storage = $request->input('storage')[$key] ?: 0;               
      $inventory->save();
    } 

我的网络路线:

Route::put('/reports/{id}', 'ReportController@update');

这里的问题是它只保存我输入的最后一个值。

附加信息

我也在使用相同的代码来存储新行,它工作正常。请看下面的代码:

public function store(Request $request) {
 //Adding inventory table
        $new_inventories = new Inventory();

        foreach($inputs as $key => $value) {

            $data[] = [
                'user_id' => $user_id,
                'report_id' => $new_report->id,
                'display' => $request->input('display')[$key] ?: 0,
                'storage' => $request->input('storage')[$key] ?: 0,
                'product_id' => $request->product_id[$key],
                'created_at' => $now,
                'updated_at' => $now,
                // 'remark' => $request->remark[$key] ?? null,
            ];
        } 

        Inventory::insert($data);  
        //End of inventory table
}

任何形式的帮助都将不胜感激。谢谢!

编辑:

我的表单如下所示:

<form action="/reports/{{$report->id}}" method="post">
@csrf
{{method_field('PUT')}}
@foreach($products as $product)
<input type="number" name="product_id[]" value="{{ $product->id}}" hidden>
<input type="number" name="storage[]">
<input type="number" name="display[]">
@endforeach
</form>

【问题讨论】:

  • 向我们展示表格.... DD on $request->input() 以供您更新
  • 很明显,您循环遍历 $input 数组/集合,但您也应该循环遍历 $inventory 数组/集合,以便能够一次更新一行。
  • 您好,我已经用其他信息更新了这个问题。我也很感激你的回复。谢谢
  • 你想更新什么?您尝试过什么调试问题?
  • 我想更新shelf_quantity 和display_quantity 我试过Inventory::update() 还是一样。而且它只取输入的最后一个值。

标签: mysql laravel


【解决方案1】:

您不能一次更新多行。在这种情况下,最好的方法是逐一获取库存中的项目并更新它们。因此,您循环访问 $request->input('product_id'),获取该 product_id 和 $report->id 的 Inventory 模型,更新并保存。

for($i=0; $i<count($request->input('product_id');$i++) {
      $inventory = Inventory::where('report_id', $report->id)->where('product_id', $request->input('product_id')[$i])->first();
      $inventory->display = $inventory->display = $request->input('display')[$i];
      $inventory->storage = $inventory->storage = $request->input('storage')[$i];          
      $inventory->save();
    } 

【讨论】:

  • 我打错字了,把 for($i=0; $iinput('product_id');$i++) { .. 改成了 ...for($i =0; $iinput('product_id');$i++) {
  • 您好,感谢您的帮助。对此,我真的非常感激。它现在实际上正在工作。如果我使用 get() 而不是 first() 有什么区别吗?
  • get() 可能会为您提供模型的集合,而 first() 肯定会为您提供模型的一个实例。
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 2011-12-24
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多