【问题标题】:Laravel foreach in form takes only last row [duplicate]Laravel foreach 形式只需要最后一行[重复]
【发布时间】:2021-05-01 07:46:34
【问题描述】:

我正在尝试通过表单更新餐厅菜单。首先,我获取菜单类别的所有内容,并通过 foreach 将它们放入输入值中,这样它们都是可编辑的,并且可以预先设置好进行编辑。

现在最大的问题是每当我完全尝试编辑表单时,它只会编辑最后一行,因为那是最后收到的,因此忽略了其余的。我如何让表单从 foreach 提交所有请求的项目?

为每个项目制作一个表单将是一个很大的禁忌,因为这样每一行都会有一个按钮,这会阻碍生产力

刀片视图:

                    <form action="test" method="head">
                        @foreach ($Voorgerecht as $item)
                        @csrf
                        <tr>
                            <td>
                                <input type="text" name="id" value="{{$item->id}}">
                            </td>
                            <td>
                                <input type="text" name="name" value="{{$item->product_name}}">
                            </td>

                            <td>
                                <input type="text" name="price" value="{{$item->product_price}}">
                            </td>
                            <td>
                                <input type="submit" value="edit">
                            </td>
                            @endforeach 
                        </tr>
                    </form>

控制器:

public function editsubmit(Request $req) {

        update::where('id',$req->id)
        ->update(['product_name'=>$req->name]);

        return redirect('/admin');
}

【问题讨论】:

  • 名称是唯一的,所以如果有多个输入使用相同的名称,那么它只会传入最后一个。您需要使用 CBroe 链接中的数组名称
  • 您还需要将结束行标记&lt;/tr&gt; 移动到foreach 内以避免创建无效标记(如果您在循环中打开一行,您也需要在此处关闭它)。
  • 我移动了 但问题是我现在将它们放在数组中,但它仍然将它们放在以 WHERE id = 1 结尾的 sql 中,从而将所有数组放在一个中

标签: javascript php html arrays laravel


【解决方案1】:

如果您真的想一次性完成所有操作,您可以将数组形式的输入命名为所有记录的容器,例如 records[1][product_name]:

<form ...>
    @csrf
    @foreach ($Voorgerecht as $item)
    <tr>
        ...
        <td>
            <input type="text" name="records[{{ $item->id }}][product_name]" value="...">
        </td>
        <td>
            <input type="text" name="records[{{ $item->id }}][product_price]" value="{{ $item->product_price }}">
        </td>
        ...
    </tr>
    @endforeach
</form>

然后在控制器中

... do validation ...

foreach ($request->input('records', []) as $id => $record) {
    Model::findOrFail($id)->update($record);
}

【讨论】:

  • 这似乎不起作用
  • 刚刚更新了它......“似乎不起作用”是什么意思?
  • 好吧,我没有模型 findorfail
  • Model 是一个占位符,表示您的模型被命名...并且所有模型都有一个 findOrFail 方法
  • 好吧,但这是来自 2 个输出的 print_r 输出: Array ( [product_name] => item1 [id] => 1 ) Array ( [product_name] => item2 [id] => 2 )我如何将这些放在更新查询中?
【解决方案2】:

您可以更改表单字段,以便将它们作为数组发布:

<input type="text" name="id[{{ $loop->index }}]" value="{{$item->id}}">

我添加了 $loop->index 以便合并所有字段。

【讨论】:

  • 好的,所以这似乎几乎现在工作了我得到这个:SQL:更新Products设置product_name=?其中id = 3
  • 开我的玩笑,我忘了也编辑名称..现在唯一的问题是它只编辑了一个 id 为 1 的行...所以所有项目现在都在数组中,但被放入第一个行
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
相关资源
最近更新 更多