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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1146閲覧

エラー Trying to get property 'id' of non-object を解決したい

HirakuMorishima

総合スコア29

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/19 23:33

##現状・お願い
現在、DBデータの削除機能を作成しています。
削除ボタンを押すと削除されるといった機能なのですが、ボタンを押すとエラーが出てしまいます。

ただしブラウザから戻るボタンを押してみると、DBのデータは削除されています。
このエラーメッセージを出さないようにするにはどのようなコードが必要か教えていただけますと幸いです。

##エラーコード
Trying to get property 'id' of non-object
(View: /home/ec2-user/environment/invoice_and_todo/resources/views/todo/editItem.blade.php)
イメージ説明

###TodoController(一部抜粋)

php

1 // 案件情報の追加・更新・削除 2 public function addNewItem(Request $request){ 3 $item = new Item(); 4 $item->user_id = Auth::user()->id; 5 $item->client_id = $request->client_id; 6 $item->item_name = $request->item_name; 7 $item->delivery_date = $request->delivery_date; 8 $item->unit_price = $request->unit_price; 9 $item->states = $request->states; 10 $item->memo = $request->memo; 11 $item->save(); 12 13 return redirect('/addItem'); 14 } 15 public function editItem($id){ 16 $list = Item::find($id); 17 return view('todo.editItem', compact('list')); 18 } 19 public function updateItem(Request $request, $id){ 20 $item = Item::where('id', '=', $request->id)->first(); 21 $item->user_id = Auth::user()->id; 22 $item->client_id = $request->client_id; 23 $item->item_name = $request->item_name; 24 $item->delivery_date = $request->delivery_date; 25 $item->unit_price = $request->unit_price; 26 $item->states = $request->states; 27 $item->memo = $request->memo; 28 $item->save(); 29 30 return redirect('/user'); 31 } 32 public function deleteItem(Request $request) 33 { 34 $item = Item::where('id', '=', $request->id)->first(); 35 $item->delete(); 36 37 return redirect()->back(); 38 } 39} 40

###web.php(一部抜粋)

php

1// 案件情報の追加・更新・削除 2Route::post('addNewItem','TodoController@addNewItem'); 3Route::get('/editItem/{id}', 'TodoController@editItem'); 4Route::post('/updateItem/{id}','TodoController@updateItem'); 5Route::delete('/deleteItem/{id}','TodoController@deleteItem');

###editItem.blade.php

php

1@extends('layouts.layout') 2@section('title','案件管理画面') 3 4@section('body') 5 <!--サイドメニューここから--> 6 <div class="row"> 7 <div class="col s0 l2"> 8 <ul id="slide-out" class="sidenav sidenav-fixed "> 9 <li><a href="{{url('/user')}}">クライアント一覧<i class="material-icons left">person</i></a></li> 10 <li><a href="#">案件カレンダー<i class="material-icons left">date_range</i></a></li> 11 <li><a href="{{url('/addClient')}}">クライアント追加<i class="material-icons left">add</i></a></li> 12 <li><a href="{{url('addItem')}}">案件追加<i class="material-icons left">add</i></a></li> 13 </ul> 14 </div> 15 <!--サイドメニューここまで--> 16 <div class="col s12 offset-l1 l8"> 17 <nav class="header"> 18 <a href="#" data-target="slide-out" class="sidenav-trigger btn-floating"><i class="medium z-depth-1 material-icons">add</i></a> 19 <h2 class="center-align">案件管理画面</h2> 20 </nav> 21 <form action="/updateItem/{{$list->id}}" method="POST"> 22 {{ csrf_field() }} 23 <div class="input-field col s12"> 24 <input id="item_name" type="text" class="validate" name="item_name" value="{{$list->item_name}}"> 25 <label for="item_name">案件名</label> 26 </div> 27 <div class="input-field col s12"> 28 <input id="delivery_date" type="text" class="datepicker" name="delivery_date" value="{{$list->delivery_date}}"> 29 <label for="delivery_date">納期</label> 30 </div> 31 <div class="input-field col s12"> 32 <input id="unit_price" type="text" class="validate" name="unit_price" value="{{$list->unit_price}}"> 33 <label for="unit_price">単価</label> 34 </div> 35 <div class="input-field col s12"> 36 <input id="memo" type="text" class="validate" name="memo" value="{{$list->memo}}"> 37 <label for="memo">備考欄</label> 38 </div> 39 <input type="submit" value="案件編集" class="waves-effect waves-light btn blue accent-1"> 40 <input type="hidden" name="client_id" value="{{$list->client_id}}" > 41 <input type="hidden" name="states" value="{{$list->states}}" > 42 </form> 43 <form method="POST" action="/deleteItem/{{$list->id}}" method="post"> 44 {{ method_field('delete') }} 45 {{csrf_field()}} 46 <input type="submit" value="案件情報削除" class="waves-effect waves-light btn red lighten-1"> 47 </form> 48 </div> 49 </div> 50 51@endsection

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラー自体はそこまで珍しいものではないのでそのまま調べてもらえれば過去質問だったり解説の記事が見つかります。意味はそこで調べてもらうとして(エラーメッセージの読み方と対処, 検索や質問の原則

redirect()->back()は直前のURLに戻るもの(HTTPレスポンス5.devより)
なので、削除処理が正常に行われた結果、そもそも$list自体が取得できなくなったことによって、
存在したときは返ってきたはずのModelが返ってこない=そもそもModel内容がないためそれぞれのプロパティも参照できない

となっているように思います。

見たところ「単一データの編集・削除」ページのようですから、
削除を行った場合は明示的に一覧ページなどにリダイレクトされたほうが良いでしょう。
deleteItem()にとっての「直前のURL」は/editItem/{id}なので。


蛇足:

ブラウザから戻るボタンを押してみると

これは動的ページを作っているのであればあまり良い確認の仕方と言えません。
データベースに直接アクセスして確認してください。

投稿2019/06/20 00:12

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問