簡體   English   中英

致電 null 上的成員 function update() [LARAVEL]

[英]Call to a member function update() on null [LARAVEL]

我正在嘗試制作一個 Laravel 應用程序,該應用程序允許登錄用戶編輯他們的紀念頁面之一。 編輯視圖有效,但一旦保存更改,它就會在 null 錯誤上向成員 function update() 發出調用 我是Laravel的新手,所以如果這是一個愚蠢的問題,我深表歉意。

Controller:

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;
}

有幾件事可能會導致此錯誤。 我認為首先要調查的是你的關系與你試圖更新的內容。

您的 User 模型有很多紀念品:

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

您的控制器正在嘗試更新一個紀念館:

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

要修復,我建議您嘗試直接更新有問題的紀念館,而不是通過用戶關系。 我假設紀念館上有一個user_id鍵 - 只需在更新您已經注入更新方法的紀念館時添加它。

您的關系不正確...您在 User 模型中沒有紀念關系。 所以它返回空

您可以輕松編輯一個紀念館,如下代碼:

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 時檢查隱私,這正是您所需要的

所以我看到原因是:在用戶模型中你定義了內存關系:

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

前提是你正確地設置了你的關系

意味着您根本沒有紀念,即沒有與該user_id相關的紀念記錄,因此無需更新,這就是我們所說的關系null意味着它不存在。

您永遠不會知道用戶是否與紀念記錄有關系,所以訣竅是如果它不存在則創建它,或者如果它存在則使用以下簡單的 eloquent 代碼更新它

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM