#php #laravel
#php #laravel
Вопрос:
Я пытаюсь извлечь входные данные из формы в базу данных, чтобы запустить операцию обновления. Однако это ошибка, которая указывает непосредственно на строку «$obj-> update(request()-> all());». Ошибка заключается в «вызове функции-члена update () при null». Я не слишком уверен, что означает эта ошибка, но я думаю, это означает, что request()-> all() имеет значение null. Я хочу, чтобы результат был таким: после обновления пользовательского ввода в базу данных пользователь будет перенаправлен на pageManagement.blade.php с помощью обратного перенаправления (‘/ p’); Однако текущий вывод — это просто сообщение об ошибке, в котором указано «Вызов функции-члена update() при null».
public function update($URI)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::find($URI);
$obj->update(request()->all());
return redirect('/p');
}
Это моя модель Page.php .
class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
}
Это мой маршрут в web.php .
Route::patch('/page/{URI}','PageController@update');
Это моя форма для ввода пользователем входных данных.
<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 }}">
@error(‘URI’) {{ $message }}
@enderror Содержимое страницы:PageContent }}»> @error(‘PageContent’) {{ $message }} @enderror tinymce.init({ селектор:’#PageContent’ })
Мой репозиторий GitHub прикреплен ниже, потому что форматирование вопроса для формы выглядит немного испорченным…
https://github.com/xiaoheixi/wfams
Спасибо, что прочитали мой вопрос! 😀
Комментарии:
1. Ошибка «Вызов функции-члена update () при null» означает, что $obj имеет значение null. Кажется, $obj = App Page::find ($ URI); не вернул то, что вы ожидали
2. Вы вызываете request(), но в этой функции вы не используете Request,
public function update($URI)
поэтому измените наpublic function update(Request $request, $URI)
3. Конечно, я собираюсь изменить это сейчас.
4. Я изменил его, но он все еще не работает.
5. После изменения какой ошибки вы получаете?
Ответ №1:
Вы используете запрос, поэтому вам нужно вызвать запрос в вашей функции для update()
метода, который вы можете использовать where()
вместо этого :
public function update(Request $request)
{
$data = $request->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::where('URI', $request->URI)
->update([
'title' => $request->title,
'pageContent' => $request->pageContent
]);
return redirect('/p');
}
Смотрите официальную документацию здесь здесь
Комментарии:
1. он может изменить ‘URI’ @sta, вы можете использовать привязку модели маршрута
2. Я пытался посмотреть видео YouTube о привязке модели маршрута, я действительно не понимаю, и пробовал все около 5 часов о привязке модели маршрута и не работает.
3. @DwarfChampion добавил ответ для использования в качестве практического кода
4. @lagbox есть две причины. Они вызывают запрос, но не определили его для функции. И метод find() с помощью глухого поиска
id
в таблице, верно? Они вызывают поле,URI
которое является строкой, поэтомуfind()
здесь ничего не могут сделать.5. В методе find() нет метода update() напрямую, но обновление () может быть возможно с помощью метода fill() в find(). В любом случае, я обновил свой ответ.
Ответ №2:
я рекомендую вам проверить существование URI, используя правило проверки «существует«:
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|exists:pages,URI',
'pageContent' => 'required'
]);
теперь, если URI не существует в вашей таблице pages, laravel вернет ошибку проверки с сообщением типа «указанный URI не существует на страницах таблицы»
Комментарии:
1. У меня проблема, в нем говорится, что ошибка теперь «Неопределенная переменная: URI».
2. php artisan route:list , найдите свой маршрут ‘страница/’ и убедитесь, что имя параметра отправлено в метод обновления
3. @OMR я предполагаю, что он не установил getRouteKeyName() в ‘URI’
Ответ №3:
я видел ваш github https://github.com/xiaoheixi/myFirstWebsite
пример использования привязки модели в контроллере :
Route::patch('/page/{URI}','PageController@update');
Route::get('{URI}', 'PageController@getPage');
public function update($URI)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::find($URI);
$obj->update(request()->all());
return redirect('/p');
}
измените контроллер на :
use AppPage;
public function getPage(Page $URI)
{
return view('page_view', compact('URI'));
}
public function update(Request $request, Page $URI)//match $URI to {URI}
{
$data = $request->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|unique:pages,URI,'.$URI->id, //you dont want a duplicate URI when you search a page by URI
'pageContent' => 'required'
]);
$URI->update($request->all());
return redirect('/p');
}
в блейде:
<form action="/page/{{ $pageContent }}" method="post">
в модели:
use IlluminateDatabaseEloquentModel;
class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
public function getRouteKeyName()
{
return 'URI';
}
}
Ответ №4:
Ошибка означает, что find
возвращено null
. Что имеет смысл, поскольку find
будет пытаться выполнить поиск по полю первичного ключа, а не по URI
полю.
Я бы не использовал URI
в качестве идентификатора для этой записи. Я бы использовал это id
.
<form action="/page/{{ $pageContent->id }}" method="post">
Route::patch('/page/{page}','PageController@update');
Это немного упростило бы ситуацию. Теперь вы можете легко использовать привязку модели маршрута, чтобы получить это Page
для вас:
use AppPage;
...
public function update(Page $page)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$page->update(request()->all());
return redirect('/p');
}
Это гарантирует, что $page
это существующий экземпляр модели. Поскольку это будет так, вы можете вызвать update
это. Просто убедитесь, что title
, URI
и pageContent
являются «заполняемыми».