質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

raraberu5.7系で「Creating default object from empty value」のエラーを解決したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 757

score 121

Laravel5.7系で編集機能を作成してます。
そこで「Creating default object from empty value」と言うエラーで躓いてます。
この解決エラー解決に関してアドバイスを頂きたいです。

理想の動きは
edit.blade.phpのform(現状、入力欄には編集前のレコード情報を表示できております)に変更内容を入力

updateアクションでDBに上書きになります。

ここで丸一日解決できず、質問させて頂いてます。何卒よろしくお願いします。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use \App\Model\ChatConversation;

class ChatConversationController extends Controller {
 public function display()
 {
  $data = ChatConversation::all();
  return view('display',['data' => $data]); 
 }

 public function create(){
  return view('create'); 
 }
 public function store(Request $request){
  $chatConversation = new ChatConversation();
  $chatConversation->save(); 
 }

 public function edit(Request $request){
  $record = ChatConversation::find($request->id);
  return view('edit', ['record'=>$record]);
 }

 public function update(Request $request) {
  $record = new ChatConversation();
  $record = ChatConversation::find($request->id);
  $record->node_id = $request->node_id;
  $record->node_id = $request->line_id;
  $record->node_id = $request->message;
  $record->node_id = $request->version_type;
  $record->node_id = $request->ip_adddr;
  $record->node_id = $request->platform;
  $record->node_id = $request->translate;
  $record->save();
  return redirect('/'); 
 }
}
?>
コード
Edit 

{{Form::open(['action' => 'ChatConversationController@update','method'=>'Post'])}}
   <label>node_id:<input type="text" name="node_id" value='{{ $record->node_id }}'></label><br>
   <label>line_id:<input type="text" name="line_id" value='{{ $record->line_id }}'></label><br>
   <label>message:<input type="text" name="message" value='{{ $record->message }}'></label><br>
   <label>version_type:<input type="text" name="version_type" value='{{ $record->version_type}}'></label><br>
   <label>ip_addr:<input type="text" name="ip_addr" value='{{ $record->ip_addr }}'></label><br>
   <label>platform:<input type="text" name="platform" value='{{ $record->platform}}'></label><br>
   <label>translate:<input type="text" name="translate" value='{{ $record->translate }}'></label><br>
<input type="submit" name="post" value="Send">
{{Form::close()}}

コード
<?php

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/display', 'ChatConversationController@display')->name('display');
Route::get('/create', 'ChatConversationController@create')->name('create');
Route::get('/store', 'ChatConversationController@store')->name('store');
Route::get('/edit', 'ChatConversationController@edit')->name('edit');
Route::post('/update', 'ChatConversationController@update')->name('update');
?>
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

修正方法だけ書いても成長できないと思うので、拙いですがデバッグの方法を説明します。

$record = ChatConversation::find($request->id);
$record->node_id = $request->node_id; // <-- ここ


失敗しているのはここの行で間違いないでしょうか?

エラーが発生しているなら、なんのファイルの、何行目というのが
エラーメッセージと合わせて一緒に出てくるはずです。
質問をする際にも、合わせて記載すると、回答者もエラー発生箇所が簡単に特定できるので回答がしやすいです。
今回のエラーを解消するにはまず
「なんのファイル、何行目」を確認します。
今回は、ChatConversationController.php32行目と仮定(推定)しています。
そして、次にエラーメッセージの内容を確認します。
Creating default object from empty value 
ですので、だいたい「空のvalueはオブジェクトの作成に使用できません」です。
英語がわからなければ、グーグル翻訳でもいいので、翻訳してエラーの意味をまず理解しましょう。
では、なぜ空のvalueと言われているのか考えましょう。
ここで、オブジェクトのようにしようし、かつ空である可能性があるのは
$record変数、とだいたい推察できます。
そこで、$recordをddしてみましょう

$record = ChatConversation::find($request->id);
dd($record);
$record->node_id = $request->node_id;

こんな感じです。おそらくnullと出力されるでしょう。
これで、findが失敗していることに気づくことができるでしょう。
ではなぜ失敗するか、データがデータベースに登録されているでしょうか?
されていない場合、findに失敗する事もあるでしょう。
ですが、今回はデータベースに正常にデータが入っていると仮定してデバッグを続けます。

それでは、データベースのデータは入っているのになぜ失敗するのでしょうか?
また、ddの出番です。今度は$request->idをddし、目的のidをちゃんと探しているかを確認しましょう。

dd($request->id);
$record = ChatConversation::find($request->id);
$record->node_id = $request->node_id;

こんな感じです。またnullですね?
ここまでデバッグすればそもそも、idが送信されていない事に気づけるのではないでしょうか。
では、なぜidが送信されないのか、viewをみてみましょう。

{{Form::open(['action' => 'ChatConversationController@update','method'=>'Post'])}}
   <label>node_id:<input type="text" name="node_id" value='{{ $record->node_id }}'></label><br>
   <label>line_id:<input type="text" name="line_id" value='{{ $record->line_id }}'></label><br>
   <label>message:<input type="text" name="message" value='{{ $record->message }}'></label><br>
   <label>version_type:<input type="text" name="version_type" value='{{ $record->version_type}}'></label><br>
   <label>ip_addr:<input type="text" name="ip_addr" value='{{ $record->ip_addr }}'></label><br>
   <label>platform:<input type="text" name="platform" value='{{ $record->platform}}'></label><br>
   <label>translate:<input type="text" name="translate" value='{{ $record->translate }}'></label><br>
<input type="submit" name="post" value="Send">
{{Form::close()}}

viewの中に、nameがidのinputがありません。
これでは、idが送られてこないのも当然です。
ここまで説明したらあとはどのように修正すればよいか、わかってもらえるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/03 22:44

    かなりご丁寧な解説ありがとうございました。
    変数が空だったのですね。
    エラーがある場合はまずは新たな解決法を探すよりも自分の加えたコードに対して疑うべきですね。
    今回教えて頂いたデバック法のようにどんどん遡って解決していくようにします。
    データは取れていると思い込んでいてデバックを軽んじました。

    キャンセル

  • 2020/01/03 22:53

    デバックを行い。エラーの原因箇所を修正して、理想の動作を確認致しました。
    貴重なお時間ありがとうございました。
    ピュアPHPの方も進めて、より理解を深めます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る