【问题标题】:Laravel, Call to undefined function Database\Seeders\factory()Laravel,调用未定义函数 Database\Seeders\factory()
【发布时间】:2020-12-28 04:00:22
【问题描述】:

运行命令时出现标题错误:

php artisan db:seed

我的截图:

我不知道这个问题是从哪里来的。我正在搜索代码示例和解决方案,但我没有找到任何东西:(

ArticlesTableSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
// use Laracasts\TestDummy\Factory as TestDummy;

class ArticlesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Models\Article::class, 30)->create();
    }
}

ArticleFactory.php

<?php

namespace Database\Factories;

use App\Models\Model;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class ModelFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = App\Models\Article::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'title' => $faker->text(50),
            'body' => $faker->text(200)
        ];
    }
}

DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

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

提前感谢您的帮助!

【问题讨论】:

标签: php laravel laravel-8


【解决方案1】:

如果您使用的是 laravel 8 版,您可以使用目录:

使用应用\模型\文章; 文章::factory()->count(30)->create();

【讨论】:

    【解决方案2】:

    这里提到的所有建议都是正确的。 如果您使用的是 Laravel 8,有时运行 composer require laravel/legacy-factories 可能会解决您的问题。 此外,如果您收到一个错误提示 Class 'Database\Factories\ArticleFactory' not found 然后确保你有class ArticleFactory extends Factory 而不是 ModalFactory。 并确保您在文章模型中使用 HasFactory,就像这里一样。

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Article extends Model
    {
        use HasFactory;
    }
    
    

    欲了解更多信息:Laravel 8 Modal Factories

    【讨论】:

      【解决方案3】:

      当我意识到我的模型没有使用 HasFactory 特征时,我遇到了同样的问题。

      <?php
      
      namespace App\Models;
      
      use Illuminate\Database\Eloquent\Factories\HasFactory;
      use Illuminate\Database\Eloquent\Model;
      
      class Category extends Model
      {
          use HasFactory;
          
          /**
           * The table associated with the model.
           *
           * @var string
           */
          protected $table = 'categories';
         
      }
      
      

      因此,请确保您的模型正在使用此特征。

      【讨论】:

      • 这正是我的问题,谢谢!它不像文档中那样清楚(至少对我而言),因为我通常查看代码 sn-ps 以查看我必须包含的内容,而在这种情况下,它是在正文中提到的文档。 laravel.com/docs/8.x/…
      【解决方案4】:

      改变

      factory(App\Models\Article::class, 30)-&gt;create(); ‍

      \App\Models\Article::factory(30)-&gt;create();

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案5】:

      ArticlesTableSeeder.php

      <?php
      
      namespace Database\Seeders;
      
      use App\Models\Article;
      use Illuminate\Database\Seeder;
      
      class ArticlesTableSeeder extends Seeder
      {
          /**
           * Run the database seeds.
           *
           * @return void
           */
          public function run()
          {
              Article::factory()->times(30)->create();
          }
      }
      

      ArticleFactory.php

      <?php
      
      namespace Database\Factories;
      
      use App\Models\Article;
      use Illuminate\Database\Eloquent\Factories\Factory;
      use Illuminate\Support\Str;
      
      class ArticleFactory extends Factory
      {
          /**
           * The name of the factory's corresponding model.
           *
           * @var string
           */
          protected $model = Article::class;
      
          /**
           * Define the model's default state.
           *
           * @return array
           */
          public function definition()
          {
              return [
                  'title' => $this->faker->text(50),
                  'body'  => $this->faker->text(200)
              ];
          }
      }
      

      【讨论】:

        【解决方案6】:

        如果您使用的是 laravel 8 版本,请查看升级指南。 “Laravel 的模型工厂功能已完全重写以支持类,并且与 Laravel 7.x 样式工厂不兼容。但是,为了简化升级过程,已经创建了一个新的 laravel/legacy-factories 包以继续使用您现有的工厂Laravel 8.x. 你可以通过 Composer 安装这个包:

        composer 需要 laravel/legacy-factories"

        https://laravel.com/docs/8.x/upgrade#seeder-factory-namespaces

        【讨论】:

          【解决方案7】:

          在 laravel 8 中删除了默认路由命名空间。

          尝试改变:

          ArticlesTableSeeder.php:

           factory(App\Models\Article::class, 30)->create();
          

          到:

          \App\Models\Article::factory()->count(30)->create(); 
          

          ArticleFactory.php:

          protected $model = App\Models\Article::class;
          

          到:

          protected $model = \App\Models\Article::class;
          

          你可能不得不改变:

           'title' => $faker->text(50),
                      'body' => $faker->text(200)
          

          到:

           'title' => $this->faker->text(50),
                  'body' => $this->faker->text(200)
          

          【讨论】:

          • 谢谢很多兄弟:D
          • 你应该提到过 Laravel 8 中删除了辅助方法 factory()
          【解决方案8】:

          尝试改变

          factory(App\Models\Article::class, 30)->create();
          

          App\Models\Article::factory()->count(30)->create();
          

          【讨论】:

            猜你喜欢
            • 2021-12-27
            • 2021-08-05
            • 2021-05-08
            • 2021-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-03
            • 2016-03-30
            相关资源
            最近更新 更多