【解決方法】Laravelがプロパティを読み取ろうとしました "ID" null で」

プログラミングQA


Laravelでクラッドを作ってみます。 作成機能と読み取り機能は完了しましたが、更新はまだ大きな問題であり、機能しますが、まったく更新されません。

Laravel Attempt to read property "id" on null''

これが私のアップデートリクエストです

{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $bedrijf = $this->route('bedrijf');
        return [
            'name' => 'string|min:2|max:75|required|unique:bedrijven,name,'.$bedrijf->id
        ];
    }
}

私のアップデートコントローラー

public function update(BedrijfUpdateRequest  $request, Bedrijf $bedrijven)
   {
       $bedrijven->name = $request-> name;
       $bedrijven->save();
       return redirect()->route('bedrijven.index')->with ('meassage', 'bedrijven gewijzigd');

   }

ルート

Route::get('admin/bedrijven/update',[BedrijfController::class, 'update'])
->name('bedrijven.update');

ページ

@extends('layouts.layout')
@section ('content')
<h2 class="my-4 text-4xl font-semibold dark:text-gray-400">
				Bewerk Bedrijven
			</h2>

@if($errors-> any())
 @foreach ($errors->all() as $error)
<li>{{$error}}</li>

 @endforeach
 @endif

<div class="w-full max-w-xs">
  <form class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4"
  action="{{route('bedrijven.update', ['bedrijven'=>$bedrijven->id])}}" method="POST">
  @method('PUT')    
  @csrf
    <div class="mb-4">
      <label class="block text-gray-700 text-sm font-bold mb-2" for="name" >
        Name
      </label>
      <input class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"  @error('name') border-red-500 @enderror 
      id="name" type="text" placeholder="name" name="name" value = "{{ old('name', $bedrijven->name)}}">
</div>
<div class="mb-4">
      <label class="block text-gray-700 text-sm font-bold mb-2" for="body" >
        Description
      </label>
      <input class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"  @error('name') border-red-500 @enderror 
      id="body" type="textfield" placeholder="body" name="body" value ="{{old('body',$bedrijven->body)}}">
</div>
    <div class="flex items-center justify-between">
      <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" 
      type="submit">
       Voeg toe
      </button>
</div>
</form>
@endsection

私が試したこと:

変数を変更しようとしたため、ページを 2 回再作成しました

解決策 1

これが意味するのは、コードでは、操作が機能して有効なオブジェクトが返されたと想定しているのに、実際には機能しなかったということです。

例えば:

... $this->route('bedrijf');

した route 「bedrijf」インデックス文字列を見つけますか? そのインデックスは有効なオブジェクトを保持していましたか? 多分そうでないかもしれません。 コードは、返されたものを使用する (メソッドまたはプロパティを呼び出す) 前に、返されたものが有効かどうかを確認することはありません。

このような検索が機能したとは決して考えないでください。

解決策 3

私の場合、モデル内で次のように関係を定義しました。

PHP
public function nationality(){
    return $this->belongsTo(Country::class, 'nationality', 'countryid');
}

多くのことを試し、ほぼ同じ関係が機能した後、メソッドの名前をnationに変更しました。

PHP
public function nation(){
    return $this->belongsTo(Country::class, 'nationality', 'countryid');
}

コメント

タイトルとURLをコピーしました