質問: こんにちは。 PHP(Laravel)初心者です。 以下のことで困っております。 どなたか、ご教授いただければと思い、投稿させていただきました。 どうぞよろしくお願いいたします。 ### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 「Laravelを使って簡単なアプリを作ってみよう」という講座を購入して、自作中なのですが、 以下のようなエラーが発生してしまい困っております。 ### 発生している問題・エラーメッセージ ``` ErrorException (E_ERROR) Class 'App\Card' not found (View: /Users/takumi/Desktop/trellolike_app/resources/views/listing/index.blade.php) ``` ### 該当のソースコード ``` PHP(Laravel) index.blade.phpのコード @extends('layouts.app') @section('content') @foreach ($listings as $listing) {{ $listing->title }} @foreach ($listing->cards as $card) {{ $card->title }} @endforeach さらにカードを追加 @endforeach @endsection 2.Listing.phpのコード hasMany('App\Card'); } } ``` ### 試したこと Appディレクトリの中に、Cardディレクトリ(もしくはCardファイル?)が存在しないからエラーが出ているのかなと考えています。 事実、Appディレクトリの中に、cardディレクトリやcard.phpのようなファイルはございませんでした。 App配下にCard〜のようなディレクトリやファイルを作るような指示や表現はなく、行き詰まってしまいました。 ### 補足情報(FW/ツールのバージョンなど) phpバージョン:PHP 7.1.23 Laravelバージョン:Laravel Framework 5.5.45 参考資料(エラー文とエラーが起こっているファイルの作成を指示された箇所) ------------------------------------ ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/4cb8b0ce0f588b61ce2768ca766fbb32.png) ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/1fa2e41dbb6e6c2c4c7b51de47ce7a8a.png)
回答: Laravelの前にオブジェクト指向(クラスの基礎)と、namespace(名前空間)の考え方を学習する必要があります。 エラーとなっている箇所の「App\Card」だけにフォーカスがあたっているようですが、それをhasMany()で呼び出していることに注目すべきと思います。 * Laravel 5.5 Eloquent:リレーション━1対多 「リレーション」と聞いてピンと来ますでしょうか? もしピンとこないのでしたらデータベースの基礎も学ぶ必要があります。 * Wikipedia:関係 (データベース)) が、理解できた前提で話を進めると。 > > Appディレクトリの中に、Cardディレクトリ(もしくはCardファイル?)が存在しないからエラーが出ているのかなと考えています。 > > > 違います。 名前空間上 Appとなっているだけで、実際は`{Laravelプロジェクトフォルダ}/app`からのパスを参照することになるはずです。 composerを利用されているのでしたらcomposer.jsonの`autoload.psr-4`を見てみると良いです。 `"App\\": "app/"`とあります。 これは`appフォルダをnamespaceのAppと名づけるよ`という指定です。 また、エラーは`Class 'App\Card' not found`とありますね。 これは`namespace App配下のCardというクラスが見つからないよ`というエラーになります。 ※このあたりはオートローダーの仕組みや概念も踏まえて覚える必要があります これらを併せると`app/ディレクトリ配下にCard.phpおよびCardクラスがない`ということになります (クラス名とファイル名は同じであるのが基本的なルールです) 今回はListing モデルからCardモデルにリレーションが貼られる様に作られているようなので、リレーションを貼ったモデルはちゃんと作りましょう。 ということですね。