Laravel-雄辩的sync()向每一行插入相同的值

时间:2018-12-08 06:31:33

标签: laravel laravel-5 eloquent

因此,我刚刚学习了如何利用嵌套迭代从数据透视表中加载数据。现在,我正在尝试保存数据,但是无法保存。

我有一个“新”刀片,客户可以用它来创建带有许多“产品”的新“订单”。

刀片基本上只是遍历所有可用的Product。 (据我所知,这就是刀片的设置方式)

new.blade.php

{!! Form::open(['url' => '/orders/store']) !!}
@foreach ($products as $product)

  <h1>{{ $product->name }}</h1>
  <p>{{ $product->description }}</p>

  {{ Form::text('qty', null }}

@endforeach

因此,这是我尝试利用嵌套迭代将“数量”数据传递到数据透视表的尝试。

OrderController.php

public function store(Request $request)
{
    $user = Auth::user();
    $user->load("orders.products"); //eager load pivot table

    /*NEW ORDER*/
    $order = new Order;
    $order->user_id = Auth::user()->id;
    $order->save();

    $product_id_array = [];

    /*PIVOT*/
    $products_to_sync_ids = [ 1,2,3,4,5,6,7,8,9 ];
    $sync_data = [];
    for ($i = 0; $i < count($products_to_sync_ids); $i++) {
        $qty = $request->input('qty');
        $sync_data[$products_to_sync_ids[$i]] = ['qty' => $qty];
    }

    $order->products()->sync($sync_data);

“订单”已保存,但数量始终默认为最后输入的Product个数量。

1 个答案:

答案 0 :(得分:2)

您要多次定义具有相同名称“ qty”的文本输入,因此提交表单时,它将为您提供名称为“ qty”的最后一个文本字段的值。

在这种情况下,您应该将qty字段定义为如下数组:

{{ Form::text('qty[]', null }}

在获取其值时,您需要对其进行迭代:

$qty = $request->input('qty');
for ($i = 0; $i < count($products_to_sync_ids); $i++) {
    $sync_data[$products_to_sync_ids[$i]] = ['qty' => $qty[$i]];
}

这可以帮助您实现所需的目标。