Laravel Eloquantでデータを得ようとしたらエラーが出た話

# 目的

- idカラムの値を指定してレコードのデータを取得しようとした際にエラーが発生した話をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 問題までの経緯

1. モデルファイルを`アプリ名ディレクトリ/app`直下から`アプリ名ディレクトリ/app/Models`直下に移動した。(Modelsディレクトリは`mkdir`コマンドにて作成した。)

1. Laravelアプリ名ディレクトリで下記コマンドを実行してtinkerを開いた。

    ```terminal
    $ php artisan tinker
    ```
1. 下記を実行してuse宣言を行った。

    ```php
    use App\Models\モデルファイル名
    ```
1. 下記を実行してidカラムが1のレコードのデータを取得しようとした。

    ```php
    $info = モデル名::find(1)
    ```

# 問題

1. 下記のエラーが発生した。

```
PHP Fatal error:  Cannot declare class App\モデルファイル名, because the name is already in use in /usr/share/nginx/html/Laravelアプリ名/app/Models/モデルファイル名.php on line 7
PHP Stack trace:
PHP   1. {main}() /usr/share/nginx/html/Laravelアプリ名/artisan:0
PHP   2. App\Console\Kernel->handle() /usr/share/nginx/html/Laravelアプリ名/artisan:37
PHP   3. Illuminate\Console\Application->run() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:131
PHP   4. Illuminate\Console\Application->run() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Console/Application.php:93
PHP   5. Illuminate\Console\Application->doRun() /usr/share/nginx/html/Laravelアプリ名/vendor/symfony/console/Application.php:147
PHP   6. Illuminate\Console\Application->doRunCommand() /usr/share/nginx/html/Laravelアプリ名/vendor/symfony/console/Application.php:271
PHP   7. Laravel\Tinker\Console\TinkerCommand->run() /usr/share/nginx/html/Laravelアプリ名/vendor/symfony/console/Application.php:1000
PHP   8. Laravel\Tinker\Console\TinkerCommand->run() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Console/Command.php:121
PHP   9. Laravel\Tinker\Console\TinkerCommand->execute() /usr/share/nginx/html/Laravelアプリ名/vendor/symfony/console/Command/Command.php:255
PHP  10. Illuminate\Foundation\Application->call() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Console/Command.php:134
PHP  11. Illuminate\Container\BoundMethod::call() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/Container.php:590
PHP  12. Illuminate\Container\BoundMethod::callBoundMethod() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:34
PHP  13. Illuminate\Container\Util::unwrapIfClosure() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:90
PHP  14. Illuminate\Container\BoundMethod::Illuminate\Container\{closure:/usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:30-34}() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/Util.php:37
PHP  15. call_user_func_array:{/usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32}() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32
PHP  16. Laravel\Tinker\Console\TinkerCommand->handle() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32
PHP  17. Psy\Shell->run() /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/tinker/src/Console/TinkerCommand.php:78
PHP  18. Psy\Shell->run() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/Shell.php:316
PHP  19. Psy\Shell->doRun() /usr/share/nginx/html/Laravelアプリ名/vendor/symfony/console/Application.php:147
PHP  20. Psy\Shell->doInteractiveRun() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/Shell.php:341
PHP  21. Psy\ExecutionLoopClosure->execute() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/Shell.php:370
PHP  22. Psy\{closure:/usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/ExecutionLoopClosure.php:32-100}() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/ExecutionClosure.php:96
PHP  23. Psy\Shell->getInput() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/ExecutionLoopClosure.php:40
PHP  24. Psy\Shell->addCode() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/Shell.php:521
PHP  25. Psy\CodeCleaner->clean() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/Shell.php:829
PHP  26. PhpParser\NodeTraverser->traverse() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner.php:227
PHP  27. PhpParser\NodeTraverser->traverseArray() /usr/share/nginx/html/Laravelアプリ名/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:91
PHP  28. PhpParser\NodeTraverser->traverseNode() /usr/share/nginx/html/Laravelアプリ名/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
PHP  29. PhpParser\NodeTraverser->traverseNode() /usr/share/nginx/html/Laravelアプリ名/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:146
PHP  30. Psy\CodeCleaner\ValidClassNamePass->leaveNode() /usr/share/nginx/html/Laravelアプリ名/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:153
PHP  31. Psy\CodeCleaner\ValidClassNamePass->validateStaticCallExpression() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:93
PHP  32. Psy\CodeCleaner\ValidClassNamePass->ensureMethodExists() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:180
PHP  33. Psy\CodeCleaner\ValidClassNamePass->ensureClassOrTraitExists() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:271
PHP  34. Psy\CodeCleaner\ValidClassNamePass->traitExists() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:255
PHP  35. trait_exists() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:375
PHP  36. spl_autoload_call() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:375
PHP  37. Composer\Autoload\ClassLoader->loadClass() /usr/share/nginx/html/Laravelアプリ名/vendor/psy/psysh/src/CodeCleaner/ValidClassNamePass.php:375
PHP  38. Composer\Autoload\includeFile() /usr/share/nginx/html/Laravelアプリ名/vendor/composer/ClassLoader.php:322
PHP  39. include() /usr/share/nginx/html/Laravelアプリ名/vendor/composer/ClassLoader.php:444

   Symfony\Component\Debug\Exception\FatalErrorException  : Cannot declare class App\モデルファイル名, because the name is already in use

  at /usr/share/nginx/html/Laravelアプリ名/app/Models/モデルファイル名.php:7
     3| namespace App;
     4| 
     5| use Illuminate\Database\Eloquent\Model;
     6| 
  >  7| class モデルファイル名 extends Model
     8| {
     9|     //
    10| }
    11| 

  Exception trace:

  1   Symfony\Component\Debug\Exception\FatalErrorException::__construct()
      /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php:148

  2   Illuminate\Foundation\Bootstrap\HandleExceptions::fatalExceptionFromError()
      /usr/share/nginx/html/Laravelアプリ名/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php:134

  Please use the argument -v to see more details.

   Whoops\Exception\ErrorException  : Cannot declare class App\モデルファイル名, because the name is already in use

  at /usr/share/nginx/html/Laravelアプリ名/app/Models/モデルファイル名.php:7
     3| namespace App;
     4| 
     5| use Illuminate\Database\Eloquent\Model;
     6| 
  >  7| class モデルファイル名 extends Model
     8| {
     9|     //
    10| }
    11| 

  Exception trace:

  1   ()
      /usr/share/nginx/html/Laravelアプリ名/vendor/composer/ClassLoader.php:444

  2   Composer\Autoload\includeFile()
      /usr/share/nginx/html/Laravelアプリ名/vendor/composer/ClassLoader.php:322

  Please use the argument -v to see more details.
```

# 問題解決までの経緯

1. データの取得に使用するモデルファイルを確認した。下記にモデルファイルの内容を記載する。

    ```アプリ名ディレクトリ/app/Models/モデルファイル.php
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class モデルファイル名 extends Model
    {
        //
    }
    ```
1. モデルファイルの設置場所を変更したにもかかわらずモデルファイル内のnamespaceの記載を変更していなかった。
1. 下記の様にモデルファイルを修正した。

    ```アプリ名ディレクトリ/app/Models/モデルファイル.php
    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class モデルファイル名 extends Model
    {
        //
    }
    ```
1. 下記の手順を実施して正常にidが１のレコードのデータを取得できたことが確認できた。
    1. Laravelアプリ名ディレクトリで下記コマンドを実行してtinkerを開く。

        ```terminal
        $ php artisan tinker
        ```
    1. 下記を実行してuse宣言を行う。

        ```php
        use App\Models\モデルファイル名
        ```
    1. 下記を実行してidカラムが1のレコードのデータを取得した。

        ```php
        $info = モデル名::find(1)
        ```