Пустой массив из контроллера в представление — Laravel

#php #laravel

#php #laravel

Вопрос:

Я новичок в Laravel, и у меня возникли некоторые проблемы с настройкой обновления для моего приложения. Я пытаюсь передать идентификатор из представления контроллеру через маршрутизацию, чтобы выбрать определенную строку, и после этого мне нужно перейти от контроллера к другому представлению. Idk, где я делаю неправильно.

Вот мой код представления, который передает идентификатор de:

 @forEach($line as $data)
    <tr>
        <td><a href="{{route('edit.line', ['id', $data->id])}}"><i class="icon ion-md-create"></i></a></td>
        <td>{{$data->name}}</td>
        <td>{{$data->time}}</td>
    </tr>
    @endforEach
  

Вот маршрут:

 Route::get('/lineEdit/{id}', 'LineController@formEdit')->name('edit.line')->middleware('auth');
  

Вот функция контроллера из route:

   public function formEdit($id){
    $line = Line::find($id);
    $lineUp = Line::select('*')
              ->where('id', $line)->get();

    return view('lineEdit')->with('line', $lineUp);
}
  

И вот часть представления, которая получит массив:

 <div class="card-body">
       @forEach($line as $data)
        <form method="POST" action="{{route('update.line', $data->id)}}">
            @csrf
            <div class="form-group row">

                <label for="name" class="col-md-4 col-form-label text-md-right">
                    {{__('Name')}}
                </label>

                <div class="col-md-8">
                    <input type="text" name="name" class="form-control {{$errors->has('name') ? 'is-invalid' : ''}}" value={{$data->name}} required autofocus >

                    @if($errors->has('name'))
                        <span class="invalid-feedback" role="alert">
                            <strong>{{$errors->first('name')}}</strong>
                        </span>
                    @endif
                </div>
            </div>
            <div class="form-group row">
                <label for="time" class="col-md-4 col-form-label text-md-right">
                    {{__('Time')}}
                </label>

                <div class="col-md-8">
                    <input type="number" name="time" class="form-control {{$errors->has('time') ? 'is-invalid' : ''}}" value={{$data->time}} required >

                    @if($errors->has('time'))
                        <span class="invalid-feedback" role="alert">
                            <strong>{{$errors->first('time')}}</strong>
                        </span>
                    @endif
                </div> 
            </div>

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

        </form>
        @endforEach
    </div>
  

Все, что находится внутри forEach, не отображается. Я не вижу проблемы.

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

1. Вы пытаетесь загрузить один Line или несколько? Кроме того, почему вы используете Line модель дважды в вашем методе контроллера?

2. Ваш код избыточен; вы запрашиваете a Line по идентификатору (через ::find($id) ), но затем вызываете, по сути, тот же запрос, за исключением того, что вы не можете использовать $line в запросе, поскольку это Model . Вам пришлось бы использовать $line->id , но опять же, это избыточно, поскольку у вас уже есть $id , что было бы то же самое… Что вы пытаетесь сделать? Кроме того, если вы пытаетесь отредактировать один Line , зачем вам отправлять его в представление в Collection ? Просто удалите @foreach() цикл и элементы управления для редактирования $line

3. @TimLewis Мне нужно, чтобы мой пользователь видел текущие данные и передавал идентификатор для обновления строки. Я удалил бесполезный запрос и оставил de find::($id) и forEach. Мне нужно, чтобы мое представление могло получать результат запроса и передавать обратно контроллеру идентификатор и новые значения.

4. @TimLewis большое вам спасибо за помощь, помимо проблем, о которых вы сказали, у меня была опечатка при передаче идентификатора контроллеру. Теперь это работает отлично

Ответ №1:

В вашем контроллере:

 public function formEdit($id){
    $line = Line::find($id);
    return view('lineEdit', compact('line'));
}
  

Я использую compact метод для отправки переменной $ line в представление.

Кроме того, если вы хотите, чтобы линейная модель редактировалась, вам это не нужно:

 $lineUp = Line::select('*')->where('id', $line)->get();
  

это нужно только для поиска вашей модели:

 $line = Line::find($id);
  

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

1. $line является ли model или null не id .

2. Использование view(...)->with('line', $lineUp); по сути такое же, как view(..., compact('line')) , так что да, они передают строку в представление.

3. $lineUp переменная не имеет для меня особого смысла, насколько я понимаю из его вопроса, он хочет только отредактировать модель. Он сравнивает идентификатор с моделью в своем запросе

Ответ №2:

Попробуйте это в вашем контроллере:

 public function formEdit($id){
    $line = Line::find($id);

    return View::make('lineEdit', compact('line'));
}
  

Это должно передать переменную $line в ваше представление

Ответ №3:

Похоже, проблема в коде контроллера.

 $line = Line::find($id);
  

возвращает вам объект (только один объект!) класса Line, если a) $id является целым числом b) $ id является первичным ключом c) этот ключ существует в базе данных

Итак, либо $line имеет значение null, либо объект модели. Следующий запрос

 $lineUp = Line::select('*')->where('id', $line)->get();
  

не может быть успешным ни в том, ни в другом случае.

Насколько я понимаю, ваше намерение $ id — это просто атрибут (потому что вы ожидаете иметь коллекцию объектов). Итак, попробуйте

 $lineUp = Line::select('*')->where('id', $id)->get();