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

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

ただいまの
回答率

87.49%

Laravelでの「php artisan db:seed」がうまくいきません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 9,168

score 32

Laravelでの「php artisan db:seed」がうまくいきません。

https://blog.hiroyuki90.com/articles/laravel-bbs/
この記事を参考に進めていましたが、かなり最初の段階で詰まりました。

環境 さくらレンタルサーバー(スタンダード)
php 7.2
Mysql 5.7
laravel 5.7.19

ファクトリーを作ります。

$ php artisan make:factory PostFactory --model=Post
$ php artisan make:factory CommentFactory --model=Comment

<?php

use Faker\Generator as Faker;

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


# database/migrations/UserFactory.php
<?php

use Faker\Generator as Faker;

$factory->define(App\Comment::class, function (Faker $faker) {
    return [
        'body' => "コメントです。テキストテキストテキストテキストテキストテキスト。\nテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト。",
    ];
});

実行用のシーダークラスを作成します。

$ php artisan make:seeder PostsTableSeeder

<?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);
            });
    }
}
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
      $this->call(PostsTableSeeder::class);
    }
}

そして実行。
$ composer dump-autoload

$ php artisan db:seed

エラー

Seeding: PostsTableSeeder

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'Post' not found

  at /home/paisen1/www/paisen2/laravel/bbs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:228
    224|         if ($this->amount < 1) {
    225|             return (new $this->class)->newCollection();
    226|         }
    227| 
  > 228|         $instances = (new $this->class)->newCollection(array_map(function () use ($attributes) {
    229|             return $this->makeInstance($attributes);
    230|         }, range(1, $this->amount)));
    231| 
    232|         $this->callAfterMaking($instances);

  Exception trace:

  1   Illuminate\Database\Eloquent\FactoryBuilder::make([])
      /home/paisen1/www/paisen2/laravel/bbs/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:178

  2   Illuminate\Database\Eloquent\FactoryBuilder::create()
      /home/paisen1/www/paisen2/laravel/bbs/database/seeds/PostsTableSeeder.php:15

  Please use the argument -v to see more details.

エラー内容もわかりませんし、調べても「composer dump-autoload」としろ、という記事ばかりで困っております。

「composer dump-autoload」は実行しました。
実行結果↓

Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump

@php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/nexmo-notification-channel
Discovered Package: laravel/slack-notification-channel
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 3747 classes

よろしくお願いします。

もしかして、Laravelインストール後に親ディレクトリの名前を変更しましたが、それが関係していますか・・・?

「laravel_bbs』→「bbs」

クラスファイルもアップしておきます。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
    'title',
    'body',
  ];

  public function comments()
  {
    return $this->hasMany('App\Comment');
  }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [
     'body',
  ];

  public function post()
  {
     return $this->belongsTo('App\Post');
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2018/12/28 09:56

    親ディレクトリというとプロジェクト名ですかね。おそらく関係ないかと。
    気になるのでしたら戻してみては?
    ちなみにApp\PostとApp\Commentはそれぞれきちんとクラスができていましたか?ファイルの中身もきちんと確認してくださいね。


    下記、結果を追記願います。
    >dump-autoloadしてみました。

    キャンセル

  • m.ts10806

    2018/12/28 10:56

    dump-autoloadの結果、
    /vendor/composer/autoload_classmap.php
    にどのように追加されましたか?
    下記のようなにあればOKかと思います。
    'App\\Post' => $baseDir . '/app/Post.php',
    'App\\Comment' => $baseDir . '/app/Comment.php',

    リンク的にはdirname(__FILE__)で取得しているのでプロジェクトフォルダの名前変更の影響はないはずです。

    キャンセル

  • rude_rockers

    2018/12/28 12:09

    ありがとうございます!

    キャンセル

回答 1

checkベストアンサー

+4

エラーメッセージを見る限り、作成しようとしているのはApp\PostではなくPostクラスでそのクラスがないからエラーになっています。

そしてもう一つ気になるのはエラーメッセージのバックトレースには

  2   Illuminate\Database\Eloquent\FactoryBuilder::create()
      /home/paisen1/www/paisen2/laravel/bbs/database/seeds/PostsTableSeeder.php:15

とありますが、質問に貼られているPostsTableSeederクラスのソースではcreate()の呼び出しは17行目であり、なぜか2行ずれています。

  1 <?php23 use Illuminate\Database\Seeder;↲
  4 use App\Post;↲
  5 use App\Comment;↲
  67 class PostsTableSeeder extends Seeder↲
  8 {↲
  9     /**↲
 10      * Run the database seeds.↲
 11      *↲
 12      * @return void↲
 13      */14     public function run()↲
 15     {↲
 16         factory(Post::class, 50)↲
 17             ->create()↲
 18             ->each(function ($post) {↲
 19                 $comments = factory(App\Comment::class, 2)->make();↲
 20                 $post->comments()->saveMany($comments);↲
 21             });↲
 22     }↲
 23 }↲

質問に貼ったソースは実際に実行されているものと異なるのではないでしょうか。確認してみてください。

(use App\Post;use App\Comment;の2行が欠けているとするとつじつまがあいます)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/28 12:14

    本当にその通りすぎて反省しました。

    自分は書き込んだものと思ってましたが、書き込んでいませんでした。
    これはお手本の方をコピペしてしまっていたようです。

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

    キャンセル

  • 2018/12/28 14:28

    いや、エラー文から正解コード見ておそらくこの二行が足りないと看破した洞察力に感動しました。
    ありがとうございました。

    キャンセル

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

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

関連した質問

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