Laravel foreach 形式只需要最后一行[重复]

Posted

技术标签:

【中文标题】Laravel foreach 形式只需要最后一行[重复]【英文标题】:Laravel foreach in form takes only last row [duplicate] 【发布时间】: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 中,从而将所有数组放在一个中 【参考方案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 的行...所以所有项目现在都在数组中,但被放入第一个行

以上是关于Laravel foreach 形式只需要最后一行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 的 foreach 循环中修改当前对象

Laravel 在同一张桌子上返回父母的孩子

如何在 Laravel 刀片类别下获取子类别

SwiftUI:删除 ForEach 中的最后一行

SwiftUI:删除 ForEach 中的最后一行

页脚值在 laravel 的 foreach 中打印相同的数据