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

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

ただいまの
回答率

90.33%

  • PHP

    21348questions

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

  • Laravel

    712questions

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

  • foreach

    70questions

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

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

解決済

回答 2

投稿 編集

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

mogu_7

score 2

 前提・実現したいこと

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

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

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

Illegal offset type

 該当のソースコード

【index.blade.php一部抜粋】

@foreach ($items as $item)
    <table class="table table-bordered table-sm text-center">
      <tr>
          <th class="info" width="50%">{{__('日付')}}</th>
          <th class="info">{{__('ユーザーID')}}</th>
          <th class="info">{{__('項目1')}}</th>
          <th class="info">{{__('項目2')}}</th>
      </tr>
      <tr>
        <td>{{ $item->refe_ymd }}</td>
        <td>{{ $item->pers_id }}</td>
        <td>{{ $item->check1 }}</td>
        <td>{{ $item->check2 }}</td>
      </tr>
    </table>
    @endforeach


【ListContoroller.php一部抜粋】

class ListController extends Controller
{
  public function index(Request $request)
  {
      $persm = Pers_m::find(Auth::user()->id);
      $pers_id = $persm->pers_id;

      if (isset($request->sort)) {
          $sort = $request->sort;
      } else {
          $sort = 'refe_ymd';
      }

      $items = List_d::where('pers_id', $pers_id)
      ->orderBy($sort,'desc')->paginate(5);
      Log::debug('List(index)', ['items' => $items]);

      $param = [
          'sort' => $sort,
          'items' => $items,
      ];
      return view('List.index', $param);
  }
}

 試したこと

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

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)を追記し実行したところ下記のように表示されました。

LengthAwarePaginator {#945 ▼
  #total: 2
  #lastPage: 1
  #items: Collection {#937 ▼
    #items: array:2 [▼
      0 => List_d {#934 ▼
        #table: "list_d"
        #primaryKey: array:2 [▼
          0 => "pers_id"
          1 => "refe_ymd"
        ]
        +timestamps: false
        #connection: "sqlite"
        #keyType: "int"
        +incrementing: true
        #with: []
        #withCount: []
        #perPage: 15
        +exists: true
        +wasRecentlyCreated: false
        #attributes: array:4 [▼
          "pers_id" => "1"
          "refe_ymd" => "20180614"
          "check1" => "1710"
          "check2" => "1448"
        ]
        #original: array:4 [▼
          "pers_id" => "1"
          "refe_ymd" => "20180614"
          "check1" => "1710"
          "check2" => "1448"
        ]
        #changes: []
        #casts: []
        #dates: []
        #dateFormat: null
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: []
        #touches: []
        #hidden: []
        #visible: []
        #fillable: []
        #guarded: array:1 [▼
          0 => "*"
        ]
      }
      1 => List_d {#935 ▶}
    ]
  }
  #perPage: 5
  #currentPage: 1
  #path: "http://localhost/List/index"
  #query: []
  #fragment: null
  #pageName: "page"
}


「0 =>」と書いてあったので、ビュー側の表示方法が間違いなのか?と思い
<td>{{ $item->refe_ymd }}</td> を、 <td>{{ $item[0]->refe_ymd }}</td> と修正しました。
するとエラー内容が変わりました。

Trying to get property 'pers_id' of non-object
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fujijun

    2018/06/28 14:18

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

    キャンセル

  • mogu_7

    2018/06/28 15:36

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

    キャンセル

回答 2

+1

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

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

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

// コントローラ
class ListController extends Controller
{
  public function index(Request $request)
  {
      $persm = Pers_m::find(Auth::user()->id);
      $pers_id = $persm->pers_id;

      dd('A: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。');

      if (isset($request->sort)) {
          $sort = $request->sort;
      } else {
          $sort = 'refe_ymd';
      }

      dd('B: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。');

      $items = List_d::where('pers_id', $pers_id)
      ->orderBy($sort,'desc')->paginate(5);

      dd('C: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。');

      Log::debug('List(index)', ['items' => $items]);

      dd('D: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。');

      $param = [
          'sort' => $sort,
          'items' => $items,
      ];

      dd('E: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。');
      return view('List.index', $param);
  }
}
<?php dd('F: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); ?>
@foreach ($items as $item)
    <table class="table table-bordered table-sm text-center">
      <tr>
      <?php dd('G: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。') ?>
          <th class="info" width="50%">{{__('日付')}}</th>
          <th class="info">{{__('ユーザーID')}}</th>
          <th class="info">{{__('項目1')}}</th>
          <th class="info">{{__('項目2')}}</th>
      </tr>
      <?php dd('H: これが表示されなければここよりも上で問題が発生している。表示されたときはこの行を削除する。'); ?>
      <tr>
        <td>{{ $item->refe_ymd }}</td>
        <td>{{ $item->pers_id }}</td>
        <td>{{ $item->check1 }}</td>
        <td>{{ $item->check2 }}</td>
      </tr>
    </table>
@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 16:05

    丁寧に教えていただきありがとうございます!
    コードを修正し実行してみたところ、コントローラーは全て問題ありませんでした(Eまで表示されました)。

    が、そのあとから【Parse error: syntax error, unexpected ';', expecting ',' or ')'】
    というエラーが発生しました。ビューの一番頭にddヘルパ関数を置いてみても同じです。

    キャンセル

  • 2018/06/28 16:30 編集

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

    キャンセル

  • 2018/06/28 16:40

    修正実行しました。
    ビューの中の、

    <td>{{ $item->refe_ymd }}</td>

    以降がエラーとなります。やはり【Illegal offset type】と出てきます。
    データの指定方法が間違っているのでしょうか?

    キャンセル

  • 2018/06/28 17:06

    「<td>{{ $item->refe_ymd }}</td>」の行の直前に、以下のように入力した場合はどのようになりますでしょうか。

    <?php dd($item->refe_ymd); ?>
    文字列の「20180614」が格納されているものと推測しているのですが…。

    キャンセル

  • 2018/06/28 17: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>
    とした場合に動作するかもご確認ください。

    キャンセル

  • 2018/06/28 17:12

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

    キャンセル

  • 2018/06/28 17:17

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

    キャンセル

  • 2018/06/28 17:36 編集

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

    キャンセル

  • 2018/06/29 11:03

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

    キャンセル

  • 2018/07/02 09:18

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

    キャンセル

check解決した方法

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 10:28

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

    キャンセル

  • 2018/07/03 11:39

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

    キャンセル

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

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

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

  • PHP

    21348questions

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

  • Laravel

    712questions

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

  • foreach

    70questions

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