Laravel 5:找不到 DB 种子类

Posted

技术标签:

【中文标题】Laravel 5:找不到 DB 种子类【英文标题】:Laravel 5: DB Seed class not found 【发布时间】:2015-07-22 11:03:17 【问题描述】:

我有这个 DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;



    class DatabaseSeeder extends Seeder 

        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        
            Model::unguard();

            $this->call('MemberInvitationSeeder');
        
    

我有这个文件 MemberInvitationSeeder.php,是 DatabaseSeeder.php 文件的兄弟

<?php

use Illuminate\Database\Seeder;
use App\MemberInvitation;

    class MemberInvitationSeeder extends Seeder 

        public function run()
        
            MemberInvitation::truncate();

            MemberInvitation::create( [
                'id' => 'BlahBlah' ,//com_create_guid(),
                'partner_id' => 1,
                'fisrt_name' => 'Thats',
                'last_name' => 'Me',
                'email' => 'me@mymail.com',
                'mobile_phone' => '444-342-4234',
                'created_at' => new DateTime
            ] );

        
    

现在我打电话

php artisan db:seed

我得到:

[ReflectionException]                        
  Class MemberInvitationSeeder does not exist

我尝试了所有能找到的方法,包括“composer dump-autoload”。无济于事。我做错了什么?

【问题讨论】:

$this-&gt;call('\MemberInvitationSeeder'); 有什么不同吗? use App\MemberInvitationSeeder in DatabaseSeeder.php 它只是声称 \MemberInvitationSeeder 未找到... 使用 App\MemberInvitationSeeder 没有效果。仍然没有找到。 你记得运行 composer dump-autoload 吗? 【参考方案1】:

第一步 - 生成种子:

php artisan make:seed MemberInvitationSeeder

第二步 - 在 DatabaseSeeder.php 中添加一行:

$this->call(MemberInvitationSeeder::class);

第三步

composer dump-autoload

第四步

php artisan db:seed

这应该可以工作


如果这不是线索,请检查 composer.json 文件并确保您在“自动加载”部分中有以下代码:

"classmap": [
    "database"
],

【讨论】:

运行“composer dump-autoload”只是我需要做的事情。 这应该是公认的答案,当前的答案是基于错误的结论或知识缺失。 很酷但有点 OT:您可以使用您的模型来播种数据库。而不是DB::table('my_foos')-&gt;insert(['col1' =&gt; 'Value 1']) 使用MyFoos::create(['col1' =&gt; 'Value1'])。好处是,自动维护的created_atupdated_at 正在为您填写。使用 DB::table('x')-&gt;insert() 时,它们是空的。【参考方案2】:

我遇到了类似的错误,但我使用的是 DB 外观 DB::table 而不是模型。我发布答案以防万一有人遇到类似问题。

种子文件有命名空间namespace Database\Seeders;,而laravel试图在命名空间内寻找数据库类,因此出现了错误。

Class 'Database\Seeders\DB' not found.

决议:

删除命名空间并运行composer dump-autoload \DB::table('stock_categories')-&gt;([ ... ]); 添加一个反斜杠,以便 Laravel 开始从根目录查找 DB 外观不是从指定的命名空间

例如,

\DB::table('MemberInvitation')->insert( [
         'id' => 'BlahBlah' ,//com_create_guid(),
         'partner_id' => 1,
         'fisrt_name' => 'Thats',
         'last_name' => 'Me',
         'email' => 'me@mymail.com',
         'mobile_phone' => '444-342-4234',
         'created_at' => new DateTime
    ] );

【讨论】:

【参考方案3】:

如果你想使用字符串作为参数,你应该包含命名空间

 $this->call('Database\Seeders\MemberInvitationSeeder');

【讨论】:

种子文件的路径无需添加。 $this-&gt;call([MemberInvitationSeeder::class]);这个就够了 你的方法就够了,我同意,但我的也行。只是一种选择【参考方案4】:

这对我有用

    composer dump-autoload php artisan db:seed

【讨论】:

【参考方案5】:

如果上述解决方案不起作用,请尝试此解决方案。 您可能已经更改了命名空间(默认情况下,它是“App”)。 你需要做的是去composer.json文件并检查这个:

"autoload": 
      "classmap": [
          "database"
      ],
      "psr-4": 
          "App\\": "app/"
      
  ,

如果命名空间是 App 这样的例子,这个解决方案不适合你。

否则,使用您找到的命名空间并将该行插入到播种器类中:

use NameSpaceFound\User;

【讨论】:

【参考方案6】:

我通过将类添加到播种文件中解决了这个问题,使用指令use

<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\YourClassName;

【讨论】:

【参考方案7】:

我相信我现在知道原因了。

新类 MemberInvitationSeeder 不在 composer.json 文件的自动加载类中。

它不存在,因为我手动添加了该类。

现在,如果我再次添加此类类,我应该使用什么来让我的类自动加载到自动加载器?

【讨论】:

查看您的 composer.json 文件。在autoload 部分,您应该看到它在哪里设置classmap,并且它应该在数组中有"database",它告诉作曲家将该文件夹中的所有内容添加到自动加载器。如果它不在那里,那是你的问题。如果它在那里,尝试composer self-update 然后composer dump 看看是否有帮助。

以上是关于Laravel 5:找不到 DB 种子类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.6 db:seed 抛出 FatalThrowableError:找不到类 'APP\Todo'

在 Laravel 5 中找不到类“App\Http\Controllers\Artisan”

php thinkphp vender第三方类找不到类怎么解决

java 主启动类找不到

Laravel 5.4 找不到请求的 URL

Python MainWindow 类找不到属性