>我正在尝试将输入数据从表单拉入数据库以运行更新操作。但是,有一个错误直接指向行"$obj->update(request()->all());".错误是"在 null 上调用成员函数 update()"。我不太确定这个错误是什么意思,但我认为这意味着 request()->all() 为空。我希望输出是在将用户输入更新到数据库后,用户将通过返回重定向('/p')重定向到 pageManagement.blade.php;但是,当前输出只是一个错误消息,指出"在 null 上调用成员函数 update()"。
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');
}
这是我的模特页面.php。
class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
}
这是我在网络上的路线.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 页面内容:
页面内容 }}"> @error('pageContent') {{ $message }} @enderror tinymce.init({ 选择器:"#pageContent" })我的 GitHub 存储库附在下面,因为表单的问题格式看起来有点搞砸了......
https://github.com/xiaoheixi/wfams
感谢您阅读我的问题! :D
您正在使用 Request,因此您需要在函数中调用Request,对于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');
}
在此处查看官方文档
我建议您使用验证规则"存在"来验证 URI 是否存在:
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|exists:pages,URI',
'pageContent' => 'required'
]);
现在,如果您的页面表中不存在URI,Laravel将返回一个验证错误,并显示诸如"表页面中不存在指定的URI"之类的消息
我看到了你的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';
}
}
该错误表示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
是"可填充的"。