Laravel,调用未定义函数Database\Seeders\factory()

36

运行命令时,我得到了标题错误:

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();
    }
}

文章工厂.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);
    }
}

非常感谢您提前的帮助!


3
似乎你不再使用 factory 辅助函数了... 你应该查看文档以了解如何调用这些工厂函数。https://laravel.com/docs/8.x/database-testing#using-factories - lagbox
10个回答

64

在 Laravel 8 中,默认的路由命名空间被移除。

尝试更改:

ArticlesTableSeeder.php:

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

至:

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

ArticleFactory.php:

翻译为:

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)

1
非常感谢你,兄弟 :D - Vipertecpro
1
你应该提到在 Laravel 8 中移除了辅助方法 factory() - Emeka Mbah
感谢Krzysiek_Sadowski。这个在Laravel 9上使用Thinker可行。\App\Models\Article::factory()->count(30)->create(); - Two
这个到现在还能正常工作。 - lothux1987

16

这里提到的所有建议都是正确的。 如果你正在使用 Laravel 8,有时运行 composer require laravel/legacy-factories 可能会解决你的问题。 另外,如果你收到一个错误,说 Class 'Database\Factories\ArticleFactory' not found 请确保你有 class ArticleFactory extends Factory 而不是 ModalFactory。 并确保在 Article 模型中使用 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


11
尝试改变。
factory(App\Models\Article::class, 30)->create();

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

8

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)
        ];
    }
}

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

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


3

修改

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

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


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1

当我意识到我的模型没有使用HasFactory trait时,我面临着相同的问题。

<?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';
   
}

所以请确保您的模型正在使用此特征。


这正是我的问题,谢谢!对我来说,文档并不像它应该的那样清晰,因为我通常查看代码片段以查看我必须包含什么,而在这种情况下,它在文档正文中提到了。 https://laravel.com/docs/8.x/database-testing#factory-and-model-discovery-conventions - Andrew Fox

0
使用$this->faker->name()代替fake()->name()方法。

0
如果您正在使用 Laravel 8 版本,您可以直接使用以下代码:
``` use App\Models\Article; Article::factory()->count(30)->create(); ```

0
  1. 使用Composer安装Laravel遗留工厂:composer require laravel/legacy-factories
  2. 运行命令生成数据库种子数据:php artisan db:seed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接