yuktkhs
@yuktkhs (yuki takahashi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Call to a member function fill() on null エラーの解消がしたい

解決したいこと

初心者です。
現在、laravelにて、プロフィールデータの更新機能を作成しています。
機能の実装中にエラーが発生しました。
原因がわからないため、知恵をください。

php.7.3.14
laravel8.0.0

発生している問題・エラー

image.png

該当するソースコード

//profileController
 public function update(Request $request)
    {
     // Validationをかける
     $this->validate($request, Profile::$rules);
     // News Modelからデータを取得する
     $profile = Profile::find($request->id);
     // 送信されてきたフォームデータを格納する
     $profile_form = $request->all();
     // 該当するデータを上書きして保存する
     $profile->fill($profile_form)->save();

        $profileHistory = new ProfileHistory;
        $profileHistory->profile_id = $profile->id;
        $profileHistory->edited_at = Carbon::now();
        $profileHistory->save();
        return redirect('admin/profile/edit');
    }

編集画面のコードも念のため共有いたします。

//profile/edit.blade.php
@extends('layouts.profile')

@section('title','プロフィールの編集')

@section('content')
<div class="container">
        <div class="row">
            <div class="col-md-8 mx-auto">
                <h2>プロフィールの編集</h2>
                <form action="{{ action('App\Http\Controllers\Admin\ProfileController@update') }}" method="post" enctype="multipart/form-data">

                    @if (count($errors) > 0)
                        <ul>
                            @foreach($errors->all() as $e)
                                <li>{{ $e }}</li>
                            @endforeach
                        </ul>
                    @endif
                    <div class="form-group row">
                        <label class="col-md-2">氏名</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="name" value="{{ $profile_form->name }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2">性別</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="gender" value="{{ $profile_form->gender }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2">趣味</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="hobby" value="{{ $profile_form->hobby }}">
                        </div>
                    </div>

                    <div class="form-group row">
                        <label class="col-md-2">自己紹介</label>
                        <div class="col-md-10">
                            <textarea class="form-control" name="introduction" rows="20">{{ $profile_form->introduction }}</textarea>
                        </div>
                    </div>

                    {{ csrf_field() }}
                    <input type="submit" class="btn btn-primary" value="更新">
                </form>
                <div class="row mt-5">
                    <div class="col-md-4 mx-auto">
                        <h2>編集履歴</h2>
                        <ul class="list-group">
                            @if ($profile_form->profileHistories != NULL)
                                @foreach ($profile_form->profileHistories as $profileHistory)
                                    <li class="list-group-item">{{ $profileHistory->edited_at }}</li>
                                @endforeach
                            @endif
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

追記 2021/01/25 マイグレーションファイル

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProfilesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('gender');
            $table->string('hobby');
            $table->string('introduction');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('profiles');
    }
}


2021/01/25 追記 Profileモデル

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    use HasFactory;
    protected $guarded = array('id');

    public static $rules = array(
        'name' => 'required',
        'gender' => 'required',
        'hobby' => 'required',
        'introduction' => 'required',
    );

    public function profileHistories()
    {
      return $this->hasMany('App\Models\ProfileHistory');

    }
}
0

3Answer

dd($request->id)を確認してみてください。
おそらくはnullもしくは空文字などになっていると思います。

  1. 編集すべきprofileのidが渡されていない
  2. データベースからデータを取得できない→$profileがnull
  3. nullにはfill()が無いのでエラー

という流れです。

パラメータを渡すには一般的に、form(inputタグ等)で渡すか、URLのパラメータとして渡す方法があります。
Laravelでどのようにするかはドキュメントを参照してください。
Laravel 7.x HTTPリクエスト
ルートパラメーター: Laravel 7.x ルーティング

1Like

Comments

  1. @yuktkhs

    Questioner

    ありがとうございます。
    dd($request->id)を確認したところnullになっていました。
    パラメータの渡し方を確認してみます。

    稚拙な質問にもかかわらずご回答いただきありがとうございました。
$profile = Profile::find($request->id);

データが取得できておらず、$profileがnullになっているのだと思います。
nullにはfill()というメソッドは無いのでエラーになります。
次の点を確認してください。

  • $request->idが想定した値になっているか
  • データベースに想定したidのデータがあるか
  • $profileに取得したデータが入っているか
0Like

Comments

  1. @yuktkhs

    Questioner

    ご回答ありがとうございます。
    $request->idとデータベース、マイグレーションファイルも確認してみましたが原因がわからずです。
  2. どのような確認をして、具体的にどういう状態だったのでしょうか?
    例えばdd()などで確認したのなら、その結果を記載することはできませんか?
  3. @yuktkhs

    Questioner

    お恥ずかしながら、ddというものを知りませんでした。
    調べて実行してみました。

    お力添えいただけますと幸いでございます。
    よろしくお願いいたします

Your answer might help someone💌