在空[LARAVEL]

时间:2019-12-09 20:20:25

标签: php database laravel sqlite

我正在尝试制作一个Laravel应用程序,该应用程序允许登录的用户编辑其纪念页之一。编辑视图可以使用,但是一旦保存更改,它就会在错误时抛出调用成员函数update()。我是 Laravel 的新手,如果这是一个愚蠢的问题,我深表歉意。

控制器:

public function edit(Memorial $memorial)
{
    $this->authorize('update', $memorial);

    return view('memorials.edit', compact('memorial'));
}

public function update(Memorial $memorial)
{
    $this->authorize('update', $memorial);

    $data = request()->validate([
        'fname' => 'required',
        'lname' => 'required',
        'bio' => '',
    ]);

    auth()->user()->memorial->update($data);

    return redirect("/memorial/{$memorial->id}");
}

查看:

<div class="container pt-5">
<form action="/memorial/{{ $memorial->id }}" enctype="multipart/form-data" method="POST">
    <legend>Edit Memorial</legend>
    @csrf
    @method('PATCH')
    <div class="form-group">
        <div class="form-row">
            <div class="col-6">
                <input id="fname" type="text" class="form-control @error('fname') is-invalid @enderror" name="fname" placeholder="First Name" value="{{ old('fname') ?? $memorial->fname }}" autofocus>

                @error('fname')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
            <div class="col-6">
                <input id="lname" type="text" class="form-control @error('lname') is-invalid @enderror" name="lname" placeholder="Last Name" value="{{ old('lname') ?? $memorial->lname }}">

                @error('lname')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="form-row">
            <div class="col-6">
                <input id="bio" type="text" class="form-control @error('bio') is-invalid @enderror" name="bio" placeholder="Biography" value="{{ old('bio') ?? $memorial->bio }}">

                @error('bio')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                @enderror
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="form-row">
            <div class="col-12">
                <button class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</form>

政策:

/**
 * Determine whether the user can update the memorial.
 *
 * @param  \App\User  $user
 * @param  \App\Memorial  $memorial
 * @return mixed
 */
public function update(User $user, Memorial $memorial)
{
    return $user->id == $memorial->user_id;
}

3 个答案:

答案 0 :(得分:2)

可能有一些原因导致此错误。我认为首先要调查的是您的关系与您要更新的内容。

您的用户模型具有许多纪念意义:

 public function memorials(){
     return $this->hasMany(Memorial::class);
} 

您的控制人正在尝试更新一个纪念馆:

auth()->user()->memorial->update($data);

要解决此问题,建议您尝试直接更新有问题的纪念馆,而不要通过用户关系进行更新。我假设纪念馆上有一个user_id键-在更新已经注入到update方法中的纪念馆时添加它即可。

答案 1 :(得分:1)

您的关系不正确...您在用户模型中没有纪念关系。因此它返回null

您可以按照以下代码轻松编辑一个纪念馆:

public function update(Memorial $memorial)
{
    $this->authorize('update', $memorial);

    $data = request()->validate([
        'fname' => 'required',
        'lname' => 'required',
        'bio' => '',
    ]);

    $memorial->update($data);

    return redirect("/memorial/{$memorial->id}");
}

因为在编辑您需要的$ memorial时授权您检查隐私

答案 2 :(得分:1)

所以我看到的原因是: 在用户模型中,您定义内存关系:

public function memorials() 
{ 
return $this->hasMany(Memorial::class); 
}

在您调用的update()函数中:     auth()-> user()-> memorial-> update($ data);  您正在调用模型,并且它建议获取纪念模型的属性。

您需要像这样致电: 在函数update()中:

auth()-> user()-> memorials()-> update($ data)

在用户模型中

/**
 * Eloquent:User
 *
 * //relation
 * @property Collection|Memorial[] $memorials
 */
class User extends Model