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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

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

PHP

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

Q&A

解決済

2回答

2146閲覧

laravel 記録データの値が取得できない

mogu_7

総合スコア7

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

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

PHP

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

0グッド

0クリップ

投稿2018/06/28 04:29

編集2018/06/28 06:26

前提・実現したいこと

今月から勉強し始めた超初心者です。初めての質問なので下記に不足している情報などがあればご指摘お願いします。

現在Laravelで清掃データ記録システムを作っています。
【完成しているもの】
場所毎に記録ページを作成。各ページで項目をチェックし記録する処理。
【やりたいこと】
記録したデータをユーザー別に一覧で表示。

発生している問題・エラーメッセージ

Illegal offset type

該当のソースコード

php

1【index.blade.php一部抜粋】 2 3@foreach ($items as $item) 4 <table class="table table-bordered table-sm text-center"> 5 <tr> 6 <th class="info" width="50%">{{__('日付')}}</th> 7 <th class="info">{{__('ユーザーID')}}</th> 8 <th class="info">{{__('項目1')}}</th> 9 <th class="info">{{__('項目2')}}</th> 10 </tr> 11 <tr> 12 <td>{{ $item->refe_ymd }}</td> 13 <td>{{ $item->pers_id }}</td> 14 <td>{{ $item->check1 }}</td> 15 <td>{{ $item->check2 }}</td> 16 </tr> 17 </table> 18 @endforeach 19 20 21【ListContoroller.php一部抜粋】 22 23class ListController extends Controller 24{ 25 public function index(Request $request) 26 { 27 $persm = Pers_m::find(Auth::user()->id); 28 $pers_id = $persm->pers_id; 29 30 if (isset($request->sort)) { 31 $sort = $request->sort; 32 } else { 33 $sort = 'refe_ymd'; 34 } 35 36 $items = List_d::where('pers_id', $pers_id) 37 ->orderBy($sort,'desc')->paginate(5); 38 Log::debug('List(index)', ['items' => $items]); 39 40 $param = [ 41 'sort' => $sort, 42 'items' => $items, 43 ]; 44 return view('List.index', $param); 45 } 46}

試したこと

ログでデータが存在することは確認しています。

local.DEBUG: List(index) {"items":"[object] (Illuminate\Pagination\LengthAwarePaginator: {"current_page":1,"data":[{"pers_id":"1","refe_ymd":"20180614","check1":"1710","check2":"1448"},"pers_id":"1","refe_ymd":"20180618","check1":"1710","check2":null}],"first_page_url":"http://localhost/List/index?page=1\",\"from\":1,\"last_page\":1,\"last_page_url\":\"http://localhost/List/index?page=1\",\"next_page_url\":null,\"path\":\"http://localhost/List/index\",\"per_page\":5,\"prev_page_url\":null,\"to\":2,\"total\":2})"}

その他

マスタデータや基本部分は知り合いの方に作ってもらいました(今は仕事の関係で連絡が取れず…)。
そのマスタデータで一覧表示するページも作ってありましたので、同じやり方でこの記録データを取得しようとしたところ上記のエラーが発生し表示できませんでした。

エラー内容を調べて「配列やオブジェクトをキーに使用できない…」という文を見つけたのですが、どこでそのような指定をしてしまっているのわかりません。どこを修正すればよいのでしょうか?

追記

「ヘルパ関数を~」とのことでしたので追記。ヘルパー関数の使い方がよくわからず、とりあえずコントローラ側にdd($items)を追記し実行したところ下記のように表示されました。

PHP

1LengthAwarePaginator {#945 ▼ 2 #total: 2 3 #lastPage: 1 4 #items: Collection {#937 ▼ 5 #items: array:2 [▼ 6 0 => List_d {#934 ▼ 7 #table: "list_d" 8 #primaryKey: array:2 [▼ 9 0 => "pers_id" 10 1 => "refe_ymd" 11 ] 12 +timestamps: false 13 #connection: "sqlite" 14 #keyType: "int" 15 +incrementing: true 16 #with: [] 17 #withCount: [] 18 #perPage: 15 19 +exists: true 20 +wasRecentlyCreated: false 21 #attributes: array:4 [▼ 22 "pers_id" => "1" 23 "refe_ymd" => "20180614" 24 "check1" => "1710" 25 "check2" => "1448" 26 ] 27 #original: array:4 [▼ 28 "pers_id" => "1" 29 "refe_ymd" => "20180614" 30 "check1" => "1710" 31 "check2" => "1448" 32 ] 33 #changes: [] 34 #casts: [] 35 #dates: [] 36 #dateFormat: null 37 #appends: [] 38 #dispatchesEvents: [] 39 #observables: [] 40 #relations: [] 41 #touches: [] 42 #hidden: [] 43 #visible: [] 44 #fillable: [] 45 #guarded: array:1 [▼ 46 0 => "*" 47 ] 48 } 49 1 => List_d {#935 ▶} 50 ] 51 } 52 #perPage: 5 53 #currentPage: 1 54 #path: "http://localhost/List/index" 55 #query: [] 56 #fragment: null 57 #pageName: "page" 58}

「0 =>」と書いてあったので、ビュー側の表示方法が間違いなのか?と思い

<td>{{ $item->refe_ymd }}</td> を、 <td>{{ $item[0]->refe_ymd }}</td> と修正しました。 するとエラー内容が変わりました。 ```log Trying to get property 'pers_id' of non-object ```

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

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

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

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

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

fujijun

2018/06/28 05:18

まずはヘルパ関数のdumpやddなどを何か所かに仕込んでいただき、問題が発生している箇所(コントローラなのかビューなのか、また、何行目なのか)を特定してください。
mogu_7

2018/06/28 06:36

追記いたしました!ヘルパ関数が初めてだったので色々調べたのですが使い方がよくわからず…このような結果になりました。
guest

回答2

0

記述されたプログラムだけでは何処に原因があるのかを特定できません。
コメント欄ではお伝えすることができませでしたので、回答欄にて記載させていただきます。

まず、プログラムがどこまで正常動作しているかを特定する必要があります。
ddヘルパ関数をブレイクポイントの代わりに利用する方法で問題個所を特定してください。

以下のようにddヘルパ関数を数か所埋め込み、「Illegal offset type」エラーが表示されるコードを特定してください。

php

1// コントローラ 2class ListController extends Controller 3{ 4 public function index(Request $request) 5 { 6 $persm = Pers_m::find(Auth::user()->id); 7 $pers_id = $persm->pers_id; 8 9 dd('A: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); 10 11 if (isset($request->sort)) { 12 $sort = $request->sort; 13 } else { 14 $sort = 'refe_ymd'; 15 } 16 17 dd('B: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); 18 19 $items = List_d::where('pers_id', $pers_id) 20 ->orderBy($sort,'desc')->paginate(5); 21 22 dd('C: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); 23 24 Log::debug('List(index)', ['items' => $items]); 25 26 dd('D: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); 27 28 $param = [ 29 'sort' => $sort, 30 'items' => $items, 31 ]; 32 33 dd('E: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); 34 return view('List.index', $param); 35 } 36}

PHP

1<?php dd('F: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); ?> 2@foreach ($items as $item) 3 <table class="table table-bordered table-sm text-center"> 4 <tr> 5 <?php dd('G: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。') ?> 6 <th class="info" width="50%">{{__('日付')}}</th> 7 <th class="info">{{__('ユーザーID')}}</th> 8 <th class="info">{{__('項目1')}}</th> 9 <th class="info">{{__('項目2')}}</th> 10 </tr> 11 <?php dd('H: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); ?> 12 <tr> 13 <td>{{ $item->refe_ymd }}</td> 14 <td>{{ $item->pers_id }}</td> 15 <td>{{ $item->check1 }}</td> 16 <td>{{ $item->check2 }}</td> 17 </tr> 18 </table> 19@endforeach

以上のコードを埋め込み、どこのddヘルパ関数までブレイクするかお伝えください。

【追記: 2018/06/28 17:30頃】
コメント欄でのやり取りから、ビュー側に渡している\App\Pers_mクラス側の問題である可能性が考えられます。
Pers_mクラス(またはその継承元の親クラス)の__toStringメソッドが独自独自定義されていないでしょうか。
__toStringメソッドですが、これはPHPのマジックメソッドで、オブジェクトを文字列として扱う場合の手順を定義するものです。
http://php.net/manual/ja/language.oop5.magic.php

これは推測ですが、元のプログラムを作成されていた方が独自の実装方法をされているもので、Laravelのビューとの相性の関係で想定動作していないものと思われます。

投稿2018/06/28 06:44

編集2018/06/28 08:32
fujijun

総合スコア38

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

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

mogu_7

2018/06/28 07:05

丁寧に教えていただきありがとうございます! コードを修正し実行してみたところ、コントローラーは全て問題ありませんでした(Eまで表示されました)。 が、そのあとから【Parse error: syntax error, unexpected ';', expecting ',' or ')'】 というエラーが発生しました。ビューの一番頭にddヘルパ関数を置いてみても同じです。
fujijun

2018/06/28 07:32 編集

【Parse error: syntax error, unexpected ';', expecting ',' or ')'】というエラーについては、プログラムの分の最後が正しく閉じられていない時に発生するエラーメッセージです。 ビュー側のコードを修正いたしましたので、お手元に反映させてみていただけますでしょうか。
mogu_7

2018/06/28 07:40

修正実行しました。 ビューの中の、 <td>{{ $item->refe_ymd }}</td> 以降がエラーとなります。やはり【Illegal offset type】と出てきます。 データの指定方法が間違っているのでしょうか?
fujijun

2018/06/28 08:06

「<td>{{ $item->refe_ymd }}</td>」の行の直前に、以下のように入力した場合はどのようになりますでしょうか。 <?php dd($item->refe_ymd); ?> 文字列の「20180614」が格納されているものと推測しているのですが…。
fujijun

2018/06/28 08:10

ちなみにですが、 <tr> <td>{{ $item->refe_ymd }}</td> <td>{{ $item->pers_id }}</td> <td>{{ $item->check1 }}</td> <td>{{ $item->check2 }}</td> </tr> …の箇所を、 <tr><td>{{dump($item)}}</td></tr> とした場合に動作するかもご確認ください。
mogu_7

2018/06/28 08:12

追記してみましたが同じエラー【Illegal offset type】が出てうまくいきませんでした…。
mogu_7

2018/06/28 08:17

もう一つの方も試してみました。こちらもエラーになってしまったのですが、内容が若干変わりました。 【Method App\List_d::__toString() must not throw an exception, caught ErrorException: Illegal offset type】
fujijun

2018/06/28 08:43 編集

現時点で判明している内容から、回答に見解を追記いたしました。 コントローラ・ビューともに、一部のコードを抜粋していただいている状況のため断定はできませんが、 モデル(Pers_mクラス)側の全く意図しない箇所で問題が発生している可能性もあります。
mogu_7

2018/06/29 02:03

ご回答ありがとうございました。Pers_mの元のModel.phpを確認したところ、__toStringメソッドが存在し、中身は【return $this->toJson();】とされていました。この場合、どのようにデータを渡せば表示できるのでしょうか?
fujijun

2018/07/02 00:18

それでは、 > 追記してみましたが同じエラー【Illegal offset type】が出てうまくいきませんでした…。 上記の際のエラー画面(プリントスクリーン)を張り付けていただくことは可能でしょうか。
guest

0

自己解決

何とか基盤を作っていただいた方と連絡が取れ、自己解決に至りました。
該当のデータ記録テーブルに「public $incrementing = false;」の記載が漏れていただけという、何とも初歩的な部分でこけていました。

他の記録データも同じ原因だと思われます。一度基本的な部分から全て見直してみます。

fujijun様>>ご丁寧に教えていただき本当にありがとうございました!身近に教えてくれる先生がいなくなってしまい途方に暮れていましたが、エラーの見つけ方など今後活かせる知識をたくさん学べました。とても嬉しく思います。こんなあっけない原因でご迷惑おかけして申し訳ありません。

投稿2018/07/03 00:54

mogu_7

総合スコア7

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

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

fujijun

2018/07/03 01:28

解決されたとのことで、安心いたしました。
mogu_7

2018/07/03 02:39

本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問