我正在尝试将输入数据从表单中拉到数据库中以运行更新操作。但是,它们是一个错误,直接指向“ $ obj-> update(request()-> all());”行。错误是“在null上调用成员函数update()”。我不太确定此错误的含义,但我认为这意味着request()-> all()为null。我想要的输出是在将用户输入更新到数据库之后,该用户将通过return redirect('/ p');重定向到pageManagement.blade.php;但是,当前输出只是一条错误消息,指出“在null上调用成员函数update()”。
public function update($URI)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = \App\Page::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 }}">
@enderror 页面内容:
@enderror tinymce.init({ 选择器:“#pageContent” })
我的GitHub存储库附在下面,因为表单的问题格式看起来有些混乱...
https://github.com/xiaoheixi/wfams
感谢您阅读我的问题! :D
答案 0 :(得分:0)
我建议您使用验证规则'exists'验证URI的存在:
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|exists:pages,URI',
'pageContent' => 'required'
]);
现在,如果您的页面表中不存在该URI,laravel将返回验证错误,并显示诸如“指定的URI在表页面中不存在”之类的消息
答案 1 :(得分:0)
您正在使用 Request ,因此您需要在函数中调用 Request 。对于update()
方法,您可以使用where()
:
public function update(Request $request)
{
$data = $request->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = \App\Page::where('URI', $request->URI)
->update([
'title' => $request->title,
'pageContent' => $request->pageContent
]);
return redirect('/p');
}
在此处here
中查看官方文档答案 2 :(得分:0)
我看到了你的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 = \App\Page::find($URI); $obj->update(request()->all()); return redirect('/p'); }
将控制器更改为:
use App\Page;
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 Illuminate\Database\Eloquent\Model;
class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
public function getRouteKeyName()
{
return 'URI';
}
}
答案 3 :(得分:0)
该错误表示find
返回了null
。这是有道理的,因为find
将尝试搜索主键字段而不是URI
字段。
我不会将URI
用作此记录的标识符。我会用的是id
。
<form action="/page/{{ $pageContent->id }}" method="post">
Route::patch('/page/{page}','PageController@update');
这将使事情简化很多。现在,您可以轻松地使用路由模型绑定为您获取此Page
:
use App\Page;
...
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
是“可填充的”即可。