95738


PHP Laravelを勉強しています。  
[ゼロから始めるPHP
～Laravelを使って掲示板を作る～](https://qiita.com/zeroPro/items/13868def907dced932bc)を参考通りに作成しています。  
`php artisan db:seed`でseedを登録しようとしたのですが、`Unable to locate factory for
[App\Post].`([App\Post] のファクトリーが見つかりません。)とエラーが表示されました。  
PostsTableSeederがPost.phpをうまく特定できていないのでしょうか？

・ディレクトリ構成

[code]

    myapp ←実行時のディレクトリ
     -app
       -Console
       -Exceptions
       -Http
       -Providers
       Comment.php
       Post.php
       User.php
    
[/code]

・PostFactory.php

[code]

    <?php
    
    use Faker\Generator as Faker;
    
    $factory->define(Post::class, function (Faker $faker) {
        return [
            'title' => '投稿のタイトル',
            'body' => "本文です。テキスト。",
        ];
    });
    
[/code]

・PostsTableSeeder

[code]

    <?php
    
    use Illuminate\Database\Seeder;
    use App\Post;
    use App\Comment;
    
    class PostsTableSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            factory(Post::class, 50)
                ->create()
                ->each(function ($post) {
                    $comments = factory(App\Comment::class, 2)->make();
                    $post->comments()->saveMany($comments);
                });
        }
    }
    
[/code]

・エラー内容

[code]

    ec2-user:~/environment/myapp $ php artisan db:seed
    Seeding: PostsTableSeeder
    
       InvalidArgumentException 
    
      Unable to locate factory for [App\Post].
    
      at vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:273
        269|      */
        270|     protected function getRawAttributes(array $attributes = [])
        271|     {
        272|         if (! isset($this->definitions[$this->class])) {
      > 273|             throw new InvalidArgumentException("Unable to locate factory for [{$this->class}].");
        274|         }
        275| 
        276|         $definition = call_user_func(
        277|             $this->definitions[$this->class],
    
          +4 vendor frames 
      5   [internal]:0
          Illuminate\Database\Eloquent\FactoryBuilder::Illuminate\Database\Eloquent\{closure}()
    
          +2 vendor frames 
      8   database/seeds/PostsTableSeeder.php:17
          Illuminate\Database\Eloquent\FactoryBuilder::create()
    
[/code]

Mysqlバージョン：mysql Ver 8.0.33 for Linux on x86_64 (MySQL Community Server - GPL)  
Laravelバージョン：Laravel Framework 7.30.6


CC BY-SA 4.0
2023-07-22T02:36:04.463
95725
2023-07-24T04:10:38.407
2023-07-24T04:10:38.407
58130
58130
question
php laravel
seedを登録したいが、ファクトリーが見つからないというエラーが発生する


factory を使う場合は， Seeder とは別に Factory 用のファイルが必要になります．

<https://qiita.com/zeroPro/items/13868def907dced932bc#4-%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E6%88%90>

参考にされている Qiita では の部分です．

Seeder は DB にデータを入れる仕組みで， Factory はどのようなデータを生成するかを切り出す仕組みです．  
実は Seeder では Factory は必須ではなかったりします．

また，現在お使いの Laravel 7.x はサポートが切れているバージョンで， 8.x から Factory
の書き方が大きく変わっているため，もしかしたらググってもなかなか情報が出てこないかもしれません．  
可能であれば最新版の 10.x まで上げることをおすすめします．（その場合その Qiita
の記事そのままでは動かない部分もあって学習が大変になるかもしれませんが．．．）


CC BY-SA 4.0
2023-07-24T02:31:59.523
95738
2023-07-24T02:31:59.523
58973
95725
answer