хранить массив из foreach l oop in laravel - PullRequest
1 голос
/ 06 апреля 2020

У меня есть функция выбора данных для определенного пользователя c, затем я хочу вставить / создать 'sid', pid,qtyremain, qtysold, amountpaid в таблицу продаж.

, но теперь, когда я запускаю запрос, я получаю ошибку ниже

Преобразование массива в строку

Любой человек может помочь исправить то, что я сделал неправильно

мой бланк представления формы

    <tbody id="tby">
    @foreach($search as $dt)

    <tr>
      <td><input type="text" value="{{$dt->items->name}}" readonly="" class="form-control"><input type="hidden" value="{{$dt->items->id}}" name="pid[]"></td>
      <td><input  name="sprice[]" value="{{$dt->items->Sprice}}" readonly="" class="form-control sprice"> </td>
      <td><input type="text" name="qtyload[]"  value="{{$dt->qty}}" readonly="" class="form-control qtyload"></td>
      <td><input type="text" name="qtyremain[]"   class="form-control qtyremain"></td>
      <td><input type="text" name="qtysold[]"   readonly="" class="form-control qtysold"></td>
      <td><input type="text" name="amount[]"   readonly="" class="form-control amount"></td>
    </tr>
    @endforeach
  </tbody>

мой контроллер

    public function store(Request $request)
  {

   //Start Store.
       request()->validate([
        'sid' => 'required',
        'qtyremain' => 'required',
        'amountpaid' => 'required',

         ]);
      for ($i = 1; $i < count($request->pid); $i++) 
          {
                $data[] =[
               'sid'=>$request->sid,
                'pid'=>$request->pid,
                'qtyremain'=>$request->qtyremain,
                'qtysold'=>$request->qtysold ,
                'amountpaid'=>$request->amountpaid,
                ];
    // dd($data);  
      }
                Sale::insert($data);

        return redirect()->back()->with('success', 'Successfully Stored');

        // }
     }

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Вы пытаетесь вставить несколько записей. однако ваша структура запроса выглядит следующим образом:

[ 
  ["sid" => [ "1" ], 
   "pid" => ["6", "8", "5"], 
   "qtyremain" => ["2" , "2", "2"], 
   "qtysold" => ["18", "38", "53" ], 
   "amountpaid" => "33333" 
  ] 
]

И ошибка возникает из-за того, что проверка Laravel не может проверить поле, значением которого является массив. Если вы хотите проверить элемент массива, вам нужно использовать *, сделать что-то вроде этого:

request()->validate([
    'sid.*' => 'required',
    'qtyremain.*' => 'required',
    'amountpaid' => 'required',
]);

Однако я предлагаю вам использовать sell[$i][pid] вместо pid[] для ввода name.

Таким образом, вам не нужно создавать структуру по l oop в бэкэнде.

    <tbody id="tby">
    @foreach($search as $i => $dt)
    <tr>
      <td><input type="text" value="{{$dt->items->name}}" readonly="" class="form-control"><input type="hidden" value="{{$dt->items->id}}" name="sale[$i][pid]"></td>
      <td><input  name="sale[$i][sprice]" value="{{$dt->items->Sprice}}" readonly="" class="form-control sprice"> </td>
      <td><input type="text" name="sale[$i][qtyload]"  value="{{$dt->qty}}" readonly="" class="form-control qtyload"></td>
      <td><input type="text" name="sale[$i][qtyremain]"   class="form-control qtyremain"></td>
      <td><input type="text" name="sale[$i][qtysold]"   readonly="" class="form-control qtysold"></td>
      <td><input type="text" name="sale[$i][amount]"   readonly="" class="form-control amount"></td>
    </tr>
    @endforeach
  </tbody>

Таким образом, структура запроса будет такой:

["sale" =>[
  ["pid" => "1", "sid" => 2, "qtyremain" => 12, "qtysold" => 22, 'amountpaid' => 23.0],
  ["pid" => "2", "sid" => 2, "qtyremain" => 15, "qtysold" => 25, 'amountpaid' => 25.0]
  ...
]]

И проверяют поля для этого массива и вставляют их более быстрым и чистым способом:

$data = request()->validate([
   'sale.*.sid' => 'required',
   'sale.*.qtyremain' => 'required',
   'amountpaid' => 'required',
   ...
]);

$sale = $data['sale'];
$array = collect($sale)->map(function($item) use ($data) { 
    $item['amountpaid'] = $data['amountpaid']; 
    return $item; 
})->all();
Sale::insert($array);
0 голосов
/ 06 апреля 2020

Ваш data является массивом. Таким образом, вы должны повторить и сделать вставку. Таким образом, вы можете заменить

Sale::insert($data);

на

foreach ($data as $record){
    Sale::insert($record);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...