如何解决“在null上调用成员函数update()”错误?

时间:2020-09-13 05:11:39

标签: php laravel

我正在尝试将输入数据从表单中拉到数据库中以运行更新操作。但是,它们是一个错误,直接指向“ $ 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 }}"> 

@error('URI'){{$ message}}

@enderror 页面内容:
pageContent}}“> @error('pageContent'){{$ message}}

@enderror tinymce.init({ 选择器:“#pageContent” })

我的GitHub存储库附在下面,因为表单的问题格式看起来有些混乱...

https://github.com/xiaoheixi/wfams

感谢您阅读我的问题! :D

4 个答案:

答案 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。只要确保titleURIpageContent是“可填充的”即可。