Редактировать / обновить базу данных Laravel

Я изо всех сил пытаюсь обновить данные в базе данных с помощью формы редактирования и не смог найти что-либо в Интернете, которое соответствует логике моей установки.

У меня есть кнопка добавления, кнопка удаления и кнопка редактирования. Добавление и удаление работ, но редактирование не обновляет данные.

Любая помощь была бы оценена, поскольку я пробовал несколько методов без успеха.

Заранее спасибо.

Посмотреть:

@extends('layouts.app')
@section('content')
    <div class="container flex-center">
        <div class="row col-md-8 flex-column">
            <h1>Edit a link</h1>
            @foreach ($links as $link)
            <form action="{{ url('link/'.$link->id) }}" method="POST">
              {!! csrf_field() !!}
              @method('PUT')
                @if ($errors->any())
                    <div class="alert alert-danger" role="alert">
                        Please fix the following errors
                    </div>
                @endif

                <h3 class="edit-link-title">{{ $link->title }}</h3>
                {!! csrf_field() !!}
                <div class="form-group{{ $errors->has('title') ? ' has-error' : '' }}">
                    <label for="title">Title</label>
                    <input type="text" class="form-control" id="title" name="title" placeholder="Title" value="{{ $link->title }}">
                    @if($errors->has('title'))
                        <span class="help-block">{{ $errors->first('title') }}</span>
                    @endif
                </div>
                <div class="form-group{{ $errors->has('url') ? ' has-error' : '' }}">
                    <label for="url">Url</label>
                    <input type="text" class="form-control" id="url" name="url" placeholder="URL" value="{{ $link->url }}">
                    @if($errors->has('url'))
                        <span class="help-block">{{ $errors->first('url') }}</span>
                    @endif
                </div>
                <div class="form-group{{ $errors->has('description') ? ' has-error' : '' }}">
                    <label for="description">Description</label>
                    <textarea class="form-control" id="description" name="description" placeholder="description">{{ $link->description }}</textarea>
                    @if($errors->has('description'))
                        <span class="help-block">{{ $errors->first('description') }}</span>
                    @endif
                    @endforeach
                </div>
                <button type="submit" class="btn btn-default submit-btn">Submit</button>
            </form>
        </div>
    </div>
@endsection

web / маршрутный контроллер:

use IlluminateHttpRequest;

Route::post('/submit', function (Request $request) {
  $data = $request->validate([
      'title' => 'required|max:255',
      'url' => 'required|url|max:255',
      'description' => 'required|max:255',
  ]);

  $link = tap(new AppLink($data))->save();

  return redirect('/');
});

use AppLink;

Route::delete('/link/{link}', function (Link $link) {
  // Link::destroy($link);
  $link->delete();
  return redirect('/');
});

Route::PUT('/link/{link}', function (Link $link) {
  $link->update();
  return redirect('/');
});

Всего 1 ответ


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

Route::PUT('/link/{link}', function (Request $request, Link $link) {
    $request->validate([
        'title' => 'required|max:255',
        'url' => 'required|url|max:255',
        'description' => 'required|max:255',
    ]);
    $link->update($request->all());
    return redirect('/');
});

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

Удачи!


Есть идеи?

10000