Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我该如何解决这个问题;在null上调用成员函数update();错误?_Php_Laravel - Fatal编程技术网

Php 我该如何解决这个问题;在null上调用成员函数update();错误?

Php 我该如何解决这个问题;在null上调用成员函数update();错误?,php,laravel,Php,Laravel,我试图将表单中的输入数据拉入数据库以运行更新操作。但是,它们的错误直接指向行“$obj->update(request()->all());”。错误是“在null上调用成员函数update()。我不太确定这个错误是什么意思,但我认为它意味着request()->all()为空。我希望输出是在更新用户对数据库的输入后,用户将通过返回重定向('/p')重定向到pageManagement.blade.php;然而,当前的输出只是一条错误消息,声明“在null上调用成员函数update() 这是我的模

我试图将表单中的输入数据拉入数据库以运行更新操作。但是,它们的错误直接指向行“$obj->update(request()->all());”。错误是“在null上调用成员函数update()。我不太确定这个错误是什么意思,但我认为它意味着request()->all()为空。我希望输出是在更新用户对数据库的输入后,用户将通过返回重定向('/p')重定向到pageManagement.blade.php;然而,当前的输出只是一条错误消息,声明“在null上调用成员函数update()

这是我的模型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 }}"> 

@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');
}