Проверка массива в Laravel

#php #arrays #laravel

#php #массивы #laravel

Вопрос:

Я все еще новичок в Laravel. Я уже пытался проверить свое поле массива, но оно кажется неудачным и выдает ошибку (что-то о подсчете в строке if (count($request->defect_id) > 0) , если я удаляю required в моем представлении блейда). Вот мой код:

ComplaintController.php

  public function store(Request $request)
    {
        if (count($request->defect_id) > 0) {
            foreach ($request->defect_id as $item => $v) {
                if (isset($request->image[$item])) {
                    $images = $request->file('image');
                    $image_resize = Image::make($images[$item]->getRealPath());
                    $image_resize->resize(900, 630);
                    $filename = $images[$item]->getClientOriginalName();

                    $image_resize = Image::make($images[$item]->getRealPath());
                    $image_resize->resize(300, 210);
                    $image_resize->save('complaint/' . $filename);
                }
                $data = array(
                        'defect_id' => $request->defect_id[$item],
                        'image' => $filename,
                        'description' => $request->description[$item],
                    );

                    Complaint::insert($data);
            }
            return redirect()->back()->with('success', 'Your report is submitted!');
        }
    }
 

Что я пробовал для проверки:

 $this->validate($request,[
     'defect_id'=>'exists:complaints,defect_id',
     'image.*'=>'mimes:jpeg,png,jpg,gif,svg|max:10000',
     'description'=>'required|max:255',
]);
 
 $validator = Validator::make($request->all(),[
    'defect_id' => 'required|array',
    'image' => 'required|array|image|mimes:jpeg,png,jpg,gif,svg',
    'description' => 'required|array|max:255',
]);
 
 $rules = [
     'defect_id' => 'required',
     'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg',
     'description' => 'required|max:255',
];
$messages = [
     'defect_id.required' => 'Types of defect is required',
     'image.required' => 'Image is required',
     'description.required' => 'Description is required',
];
$validator = Validator::make($request->all(), $rules, $messages);
    if ($validator->fails()) {
        return Response::json(array('errors' => $validator->getMessageBag()->toArray()));
    }
    else {
        $data = array(
            'defect_id' => $request->defect_id[$item],
            'image' => $filename,
            'description' => $request->description[$item],
}
 

form.blade.php

 <div class="panel-heading">
    <h3 class="panel-title"><strong>Make New Report</strong></h3>
</div>
<div class="panel-body">
    <div>
        <div class="panel">
            <form action="{{ url('/complaint-store') }}" method="post" enctype="multipart/form-data">
            @csrf
            <table class="table">
                <thead>
                   <tr>
                       <th>Type of Defect</th>
                       <th>Image</th>
                       <th>Description</th>
                       <th></th>
                   </tr>
                </thead>

                <tbody>
                  <tr>
                     <td>
                        <select class="form-control" name="defect_id[]" required>
                            <option disabled selected>Choose defect</option>
                            @foreach(AppDefect::all() as $defect)
                                <option value="{{$defect->id}}">{{$defect->name}}</option>
                            @endforeach
                        </select>
                     </td>
                     <td>
                        <input type="file" class="form-control-file" name="image[]" required>
                     </td>
                     <td>
                        <textarea class="form-control" rows="2" name="description[]" required></textarea>
                     </td>
                     <td>
                        <button type="button" class="btn btn-info btn-sm" id="add-btn"><i class="glyphicon glyphicon-plus"></i></button>
                     </td>
                  </tr>
               </tbody>
            </table>
            <center><button type="submit" class="btn btn-primary" >Submit</button></center>
            <br>
         </form>
      </div>
   </div>
</div>

@section('footer')
    <script>
        $(document).ready(function () {
            $('#add-btn').on('click',function () {
                var html = '';
                html  = '<tr>';
                html  = '<td><select class="form-control" name="defect_id[]" required><option value="" selected>Choose Defect</option>@foreach(AppDefect::all() as $defect)<option value="{{$defect->id}}">{{$defect->name}}</option>@endforeach</td>';
                html  = '<td><input type="file" class="form-control-file" name="image[]" required></td>';
                html  = '<td><textarea class="form-control" rows="2" name="description[]" required></textarea></td>';
                html  = '<td><button type="button" class="btn btn-danger btn-sm" id="remove-btn"><i class="glyphicon glyphicon-minus"></i></button></td>';
                html  = '</tr>';
                $('tbody').append(html);
            })
        });

        $(document).on('click','#remove-btn',function () {
            $(this).closest('tr').remove();
        });
    </script>
@stop
 

Я надеюсь, что кто-нибудь сможет мне помочь в этом коде. Заранее благодарю.

Комментарии:

1. Какую ошибку вы получили?

2. Если я правильно понял, вы ожидаете массив из select поля HTML, но он возвращает только одно значение, которое является выбранной опцией. Вот почему defect_id не является счетным (~ array). Смотрите примеры правильного select использования здесь: w3schools.com/tags/tag_select.asp

Ответ №1:

Это потому $request->defect_id , что is null , count не работает со null значением (начиная с php 7 )

вы можете изменить, как показано ниже: $request->defect_id сначала проверьте, затем посчитайте.

 if ($request->defect_id != null amp;amp; count($request->defect_id) > 0) {
....
}