Php 我该如何解决这个问题;在null上调用成员函数update();错误?
我试图将表单中的输入数据拉入数据库以运行更新操作。但是,它们的错误直接指向行“$obj->update(request()->all());”。错误是“在null上调用成员函数update()。我不太确定这个错误是什么意思,但我认为它意味着request()->all()为空。我希望输出是在更新用户对数据库的输入后,用户将通过返回重定向('/p')重定向到pageManagement.blade.php;然而,当前的输出只是一条错误消息,声明“在null上调用成员函数update() 这是我的模型Page.phpPhp 我该如何解决这个问题;在null上调用成员函数update();错误?,php,laravel,Php,Laravel,我试图将表单中的输入数据拉入数据库以运行更新操作。但是,它们的错误直接指向行“$obj->update(request()->all());”。错误是“在null上调用成员函数update()。我不太确定这个错误是什么意思,但我认为它意味着request()->all()为空。我希望输出是在更新用户对数据库的输入后,用户将通过返回重定向('/p')重定向到pageManagement.blade.php;然而,当前的输出只是一条错误消息,声明“在null上调用成员函数update() 这是我的模
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 }}">
@csrf
@方法('补丁')
标题:
@错误('title'){{{$message}
@enderror
URI:
@错误('URI'){{$message}@enderror 页面内容:
页面内容}}“> @错误('pageContent'){{$message}@enderror tinymce.init({ 选择器:“#页面内容” }) 我的GitHub存储库附在下面,因为表单的格式问题看起来有点混乱
感谢阅读我的问题!:D我建议您使用验证规则“”验证URI是否存在:
现在,如果您的pages表中不存在URI,laravel将返回一个验证错误消息,如“指定的URI在table pages中不存在”您正在使用请求,因此您需要在函数中调用请求,对于
更新()
方法,您可以使用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');
}
请参阅此处的官方文档我看到了您的github
示例使用模型绑定控制器:
将控制器更改为:
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">
该错误意味着
find
返回null
。这是有意义的,因为find
将尝试搜索主键字段,而不是URI
字段
我不会使用URI
作为此记录的标识符。我会使用它的id
<form action="/page/{{ $pageContent->id }}" method="post">
Route::patch('/page/{page}','PageController@update');
这将确保
$page
是一个现有的模型实例。因此,您可以在其上调用update
。只需确保title
、URI
和pageContent
是“可填充的”。错误是“在null时调用成员函数update()“表示$obj为空。似乎$obj=\App\Page::find($URI);没有返回您所期望的内容您正在调用request(),但是在这个函数中您没有使用request,公共函数更新($URI)
所以更改为公共函数更新(request$request,$URI)
当然,我现在要更改它。我更改了,但它仍然不起作用。在更改了哪个错误之后?我有一个问题,它说错误现在是“未定义的变量:URI”。php artisan route:list,find your route“page/”,并确保参数名send to updatemethod@OMR我猜他没有将getRouteKeyName()设置为“URI”,他可能会更改“URI”@sta,你可以使用路由模型绑定我试着在路由模型绑定上观看YouTube视频,我真的不太明白,试了5个小时关于路由模型绑定的所有内容,但都不起作用。@DwarfChampion添加了一个答案作为练习使用code@lagbox有两个原因。他们调用请求,但没有将其定义到函数中。deafult的find()方法搜索表上的id
,对吗?他们正在调用字段URI
,该字段是一个字符串,因此find()
在这里无法执行任何操作。find()方法中没有update()方法,但是find()中的fill()方法可以直接执行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';
}
}
<form action="/page/{{ $pageContent->id }}" method="post">
Route::patch('/page/{page}','PageController@update');
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');
}