#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();