【Laravel】Property [id] does not exist on this collection instance.

2回もこのミスをしてしまったのでいい加減備忘録を。。

エラー文

Property [id] does not exist on this collection instance.

DBより抽出したデータをbladeなどで -> で取ろうとすると取れないときがあります。
抽出したデータ
$data = DB::table(‘students’)->where(‘id’,1)->get();
エラーが出た原因
$data->id

「このコレクションインスタンスにそのようなプロパティはありません」という意味ですが、これを理解するためには、下記2点の理解が必要です。

解決方法の下に備忘録として残しておきます。

1.【返り値】

laravelでDBからget()やselect()で取ってきたデータがどんなデータか

2.【オブジェクト指向】

プロパティとはなにか

 

解決方法

$data = DB::table(‘students’)->where(‘id’,1)->get();

①今回のエラーの場合、ここでデータを1件に絞り込むような絞り込み方をしていて、データが1件しかない前提で、その1件のデータから$data->idというようなidのとり方をしていました。例え1件でもforeachで回さないと。。というのが解決方法

確かにget()なんて1件を取る取り方じゃないんだからと反省 ^^;

②またはfirst()などで1件のデータを取るメソッドを使えば$data->idでデータ取得可能

$data = DB::table(‘students’)->where(‘id’,1)->first();

 

返り値

get()

$data = DB::table(‘students’)->where(‘id’,1)->get();の返り値はCollectionクラス

where()や他メソッドで検索、絞り込んでからget()メソッドを使用

bladeでforeachでループさせて $data->id 、$data->nameなどで各データを取得

このCollectionの中身はModelの各データで構成されてます。->矢印で取るデータは(後ほど出てきますが)Modelの中のプロパティ変数を取るものなので、データが1件しかなくとも、各Modelの集合体の配列であるCollectionからは$data->idという取り方ではエラーが出たのです。

object(Illuminate\Support\Collection)#268 (1)
{ [“items”:protected]=> array(1) { [0]=> object(stdClass)#270 (6) { [“id”]=> int(1) [“created_at”]=> NULL [“updated_at”]=> NULL [“name”]=> string(6) “Yamada” [“belongs”]=> string(1) “A” [“club”]=> string(8) “baseball” } } }

他のCollectionクラスで使用可能なメソッド

 

first()

$data = DB::table(‘students’)->first();の返り値はModelのオブジェクト

object(stdClass)#270 (6) { [“id”]=> int(1) [“created_at”]=> NULL [“updated_at”]=> NULL [“name”]=> string(6) “Yamada” [“belongs”]=> string(1) “A” [“club”]=> string(8) “baseball” }

 

find()

idによる1件のデータを抽出

$data = DB::table(‘students’)->find(1);の返り値はModelのオブジェクト

*$data = DB::table(‘students’)->find([1,2]);とすると配列で2件抽出可能

object(stdClass)#270 (6) { [“id”]=> int(1) [“created_at”]=> NULL [“updated_at”]=> NULL [“name”]=> string(6) “Yamada” [“belongs”]=> string(1) “A” [“club”]=> string(8) “baseball” }

 

オブジェクト指向

オブジェクト指向について理解しようとするとだいぶ長くなってしまうので今回はエラー文にあった「プロパティ」に関するところを備忘録として残します。

Property [id] does not exist on this collection instance.

オブジェクト指向とは設計図(クラス)からインスタンス(オブジェクト)を作ることを意味します。

クラスとは、(各Model).phpでこのように書かれている書式で作成されます。

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
   処理
}

このクラスが持つ変数がプロパティです。

また、このクラスが持つ関数をメソッドといいます。

変数を宣言し、使用することでデータを記憶したり、必要な箇所で利用することができます。

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
  //プロパティ変数を定義
   public $name;

  //メソッド
  function studentDetail() {
    return $this->name.'さんは'.$this->club.'部に所属しています';
  
}

 

まとめ

今回エラーが出た原因は、->矢印で取るデータはModelの中のプロパティ変数を取るものなので、$data = DB::table(‘students’)->where(‘id’,1)->get();のデータの取り方では各Modelの集合体の配列であるCollectionからは$data->idという取り方ではエラーが出たということでした。

 

次はやらないように気をつけよう。。(´・ω・`)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です