laravel 如何在视图中添加数组并将其传递给控制器

ecr0jaav  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(136)

你好,我想知道是否有可能有一个数组在查看刀片,是由用户选择的值填充,然后传递到控制器.我问是否有可能这样做的事情,并避免这种类型的代码,我已经有这样的作品:

foreach ($request->products as $index => $product) {

                $values[] = [
                    'order_id' => $order->id,
                    'product_id' => $product,
                    'amount' => $request->amount[$index],
                ];

所以对于foreach,我不需要写$index => $product
这是来自视图的请求:

$request->validate([
            'order_number' => 'required',
            'client_id' => 'required|exists:clients,id',
            'description' => 'required',
            'products' => 'required|exists:products,id',
            'amount' => 'required',
        ]);

这是我使用的视图:

<div class="row mb-3">
                                <label for="products" class="col-md-4 col-form-label text-md-end">{{ __('Product') }}</label>

                                <div class="col-md-6">
                                    <select name="products[]" id="products" type="text" class="form-control @error('products') is-invalid @enderror" required autocomplete="products">

                                        @foreach($products as $product)

                                            <option value="{{$product->id}}">{{$product->name}}</option>
                                        @endforeach

                                    </select>

                                    @error('products')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                    @enderror
                                </div>
                            </div>

                            <div class="row mb-3">
                                <label for="amount" class="col-md-4 col-form-label text-md-end">{{ __('Amount') }}</label>

                                <div class="col-md-6">
                                    <input id="amount" type="text" class="form-control @error('amount') is-invalid @enderror" name="amount[]" required autocomplete="amount">

                                    @error('amount')

                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>

                                    @enderror
                                </div>
                            </div>
4bbkushb

4bbkushb1#

如果我没理解错的话,你想避免使用JQuery吗?这取决于你使用的环境和语言。在ASP.NET内核中,你可以使用一个隐藏的输入字段,并以文本的形式传递一些内容。

<input hidden type="text" name="productsString" value="@JsonSerializer.Serialize(products)" />

然后在你的控制器中你可以反序列化它(C#示例)。

var products = JsonSerializer.Deserialize<Object>(productsString);

也许这就是你想要的,但这真的取决于你在做什么,我不确定。

zujrkrfu

zujrkrfu2#

我们可以使用输入名称创建一个关联数组,并将product id用作数组中的键。
您可以通过为数组索引添加产品ID并标记将进入该数组索引的字段来实现这一点。

<input type="number" name="products[ {{$product_id}} ][amount]">
<input type="text" name="products[ {{$product_id}} ][otherField]">

这将产生一个结构

["products"]=> array(2) 
    { [101]=> array(2) { 
          ["amount"]=> string(2) "10" ["otherField"]=> string(7) "LABEL 1" }
      [102]=> array(2) { 
          ["amount"]=> string(2) "20" ["otherField"]=> string(7) "LABEL 2" }
    }

虽然您仍然必须使用foreach($request->products as $productID => $data)进行迭代,但是数据结构在数据存储位置方面完全是关系型的。

相关问题