Обновление цены столбца в моей таблице продуктов с учетом данных, полученных из формы - PullRequest
3 голосов
/ 07 августа 2020

Заранее благодарю за помощь.

У меня есть таблица в моей базе данных. Migration.

Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->integer('group');
        $table->string('code');
        $table->string('name');
        $table->double('price');
        $table->timestamps();
    });

Я извлекаю все продукты из базы данных и сортирую их согласно group в моем view. input name = "{{id}}" и input value = "{{price}}"

См. Мой form:

<form method="POST" enctype="multipart/form-data" action="{{route('product.update')}}">
@csrf
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
    <li class="nav-item">
        <a class="nav-link active" id="pills-ns_890-tab" data-toggle="pill" href="#ns_890_main"
           role="tab" aria-controls="pills-ns_890" aria-selected="true">KX-NS890</a>
    </li>

</ul>

<div class="tab-content" id="pills-tabContent">
    <div class="tab-pane fade show active" id="ns_890_main" role="tabpanel" aria-labelledby="pills-ns_890-tab">
        @foreach($main_890 as $item)
            <div class="form-group row">
                <label for="{{$item->id}}" class="col-md-4 col-form-label text-md-right">{{$item->code. ' ' .$item->name}}</label>
                <div class="col-md-6">
                    <div >
                        <input name="{{$item->id}}" type="number" min="0" id="{{$item->id}}" class="form-control @error('{{$item->id}}') is-invalid @enderror"
                               value="{{$item->price}}" autocomplete="{{$item->id}}" required autofocus>
                    </div>
                </div>
            </div>
        @endforeach
    </div>

</div>




<div class="form-group row mb-0">
    <div class="col-md-6 offset-md-4">
        <button type="submit" class="btn btn-primary">
            {{ __('Save and Continue') }}
        </button>
    </div>
</div>
</form>

После отправки формы я получаю следующее, когда dd($request) в моем Controller.

+request: Symfony\Component\HttpFoundation\ParameterBag {#44 ▼
#parameters: array:187 [▼
  "_token" => "XdnsoU9sqtgYpwFAqGQRM2fTde6mYJhhwJL3a3R2"
  119 => "8461"
  120 => "9682"
  121 => "501"
  122 => "2008"
  123 => "16141"
  124 => "5385"
  125 => "9122"
  126 => "3310"
  127 => "1692"
  128 => "2811"
  129 => "1686"
  130 => "2811"
  131 => "1506"
  132 => "1064"
  133 => "4078"
  134 => "8329"

И dd($request) заканчивается следующим образом:

  115 => "115"
  116 => "2660"
  117 => "730"
  118 => "8400"
  28 => "1200"
  29 => "75"
  30 => "95"
  31 => "68"
  32 => "243"
  33 => "474"
  202 => "56"
  203 => "1990"
  204 => "760"
  205 => "760"
  206 => "115"

Причина, по которой я включаю последнюю часть dd($request), заключается в том, что когда форма отправлена, она примет значение, присвоенное 119, которое равно 8461, но в обновлениях базы данных запись where id равна 206, последняя запись, полученная из моей формы, поэтому 206 => "115" становится 206 => "8461", это единственная запись, которая затем обновляется в базе данных.

Я пытаюсь обновить столбец цен по id значением, полученным из формы.

См. мой код ниже:

$products = collect($request->except(['_token']))
        ->mapWithKeys(function($item, $key) {
            return [$key => ['price' => $item]];
        })->all();

    foreach ($products as $product){
        $id = collect($request->except(['_token']))->mapWithKeys(function ($item){
            return ['id' => $item];
        });

        DB::table('products')->
        where('id', $id)->
        update(array('price' => $product['price']));

Пожалуйста, сообщите мне, где я упал с вагона?

Ответы [ 2 ]

3 голосов
/ 07 августа 2020

Его можно упростить примерно так:

collect($request->except(['_token']))->each(static function($item, $key) {
    return DB::table('products')->where('id', $key)->update([
        'price' => $item
    ]);
})

Нет необходимости делать слишком сложные вещи со всем этим отображением, которое вы делаете, что в конечном итоге приводит к вашей проблеме, с которой вы столкнулись. Я предполагаю, что порядок данных сопоставления / запроса не совпадает, поэтому, когда вы выполняете второй mapWithKeys в foreach, он не соответствует текущему $product, который вы повторяете.

Надеюсь это немного помогает.

1 голос
/ 07 августа 2020

L oop данные и используйте модели Eloquent для обновления данных. Поскольку я помогал вам в другом вопросе, mapWithKeys() предназначался для борьбы с обновлениями сводной таблицы, вам часто не следует использовать это. Так как это для особых условий, здесь вы можете просто oop. Я всегда предпочел бы красноречивые модели DB :: update ().

foreach ($request->except(['_token']) as $id => $price) {
    $product = Product::find($id);
    $product->price = $price;
    $product->save();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...