Есть ли функция для обновления текущей записи в базе данных с помощью входных данных формы в laravel Framework?

#php #laravel

#php #laravel

Вопрос:

У меня возникли проблемы с запуском следующего кода для обновления моей базы данных с помощью формы ввода, которую заполнил пользователь. Идеальным результатом было бы перенаправление на мой pageManagement.blade после обновления записи в базе данных. Текущий вывод — это сообщение об ошибке: вызов функции-члена update() для строки.

Код, который я использовал, показан ниже.

PageController@функция обновления.

     public function update($URI)
{
    $data = request()->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10',
        'pageContent' => 'required'
    ]);
    $URI->update($data);
    return redirect('/p');
}
  

editPage.blade.php

 <h1>Fill in the form to edit a page below.</h1>
<form action="/page/{{ $pageContent->URI }}" method="post">
@csrf
@method('PATCH')
  <label for="title">Title:</label><br>
  <input type="text" id="title" name="title" autocomplete="off" value="{{ $pageContent -> title     
}}"><br>
  @error('title') <p style="color: red">{{ $message }}</p> @enderror
  <label for="URI">URI:</label><br>
  <input type="text" id="URI" name="URI" autocomplete="off" value="{{ $pageContent -> URI }}">    
<br>
  @error('URI') <p style="color: red">{{ $message }}</p> @enderror
  <label for="pageContent">Page Content:</label><br>
  <textarea id="pageContent" name="pageContent" value="{{ $pageContent -> pageContent }}"> 
</textarea>
  @error('pageContent') <p style="color: red">{{ $message }}</p> @enderror
  <input type="submit" value="Submit">
</form>

THE SCRIPT SRC SHOULD BE HERE BUT HAS NOT BEEN INCLUDED DUE TO THE INDENTATION ISSUE WITH     
STACKOVERFLOW.
<script>
tinymce.init({
    selector:'#pageContent'
})
</script>
  

Web.php файл, в котором я храню свои маршруты.

 Route::patch('/page/{URI}','PageController@update');
  

Ссылка на мой репозиторий GitHub прикреплена ниже, если вы хотите лучше ознакомиться с кодом.

https://github.com/xiaoheixi/wfams

Спасибо всем за помощь!

Ответ №1:

Ошибка исходит от не созданного объекта URI . Вы передаете строку из своей формы — что бы $pageContent->URI это ни было. Без загрузки объекта, который вы хотите обновить, это просто строка, следовательно, сообщение об ошибке.

 $URI->update($data);
  

в конце вашего метода в основном говорится что-то вроде «вызовите обновление по номеру 32» ( 32->update($data) ).

Чтобы исправить ошибку в вашем вопросе, вы можете создать экземпляр объекта в начале вашего метода:

  public function update($URI)
{
  $data = request()->validate([
    'title' => 'required',
    'URI' => 'required|min:5|max:10',
    'pageContent' => 'required'
  ]);
  $obj = AppURIModel::find($URI); // Whatever the model is
  $obj->update(request()->all());
  return redirect('/p');
}
  

Альтернативное исправление: поскольку у вас есть именованная переменная внутри файла маршрута, вы также можете воспользоваться привязкой к модели маршрута, введя модель непосредственно в метод() для сохранения строки кода:

 public function update(AppURIModel $URI)
{
  $data = request()->validate([
    'title' => 'required',
    'URI' => 'required|min:5|max:10',
    'pageContent' => 'required'
  ]);
  $URI->update(request()->all);
  return redirect('/p');
}
  

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

1. Watercayman, после выполнения вашего альтернативного исправления у меня 404 не найдено. Это связано с AppPage $URI в параметре update. Если я удалю App Page, он вернется с той же ошибкой, что и раньше.

2. Watercayman, после выполнения вашего исправления у меня появляется ошибка, которая гласит «Вызов функции-члена update() при null». Я проверил свою базу данных, и ничего не равно нулю. Для меня это не имеет никакого смысла, почему в ошибке указано, что оно равно нулю.

3. Я думаю, что это говорит о том, что ‘request()-> all()’ равно нулю.

4. Может быть, что ничего не поступает. Отслеживайте это с помощью вставки объекта запроса, как рекомендует Laravel: update(IlluminateHttpRequest $request, AppPage $URI) Также — в исправлении alt была опечатка — должно быть request()->all() . Но прямой проблемой является значение null для объекта входящей страницы . Если это значение равно null, возможно, вы возвращаете неправильное значение — вы уверены, что у вас есть страница в базе данных для любого идентификатора, который поступает через $URI ? Любое значение, которое вы отправляете в update() , должно быть соответствующим идентификатором — если вы не используете URI в качестве идентификатора, произойдет сбой.