laravel 播种机出错,不会播种

laravel seeder is giving an error and won't seed

我一直在努力让我的播种机工作,但它一直给我以下错误

 Call to undefined function Database\Seeders\factory()

  at database/seeders/ContactTableSeeder.php:16
     12▕      * @return void
     13▕      */
     14▕     public function run()
     15▕     {
  ➜  16▕         factory('App\Models\Contact', 100)->create()
     17▕         ->each(function($contact) {
     18▕             $contact->addresses()->save(
     19▕                 (factory(App\Address::class)->make())
     20▕             );

      +24 vendor frames 
  25  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

我的数据库播种器

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        //Model::unguard(); // Disable mass assignment

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

        //Model::reguard();
    }
}

我的 ContactTableSeeder

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class ContactTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory('App\Models\Contact', 100)->create()
        ->each(function($contact) {
            $contact->addresses()->save(
                (factory(App\Address::class)->make())
            );
        });
    }
}

我的联系人工厂

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Models\Contact;
use Faker\Generator as Faker;

$factory->define(Contact::class, function (Faker $faker) {
    return [
            'firstName' => $faker->firstName,
            'lastName' => $faker->lastName,
            'email' => $faker->unique()->email,
            'phone' => $faker->phoneNumber,
            'birthday' => $faker->date($format = 'Y-m-d', $max = 'now')
        ];
    });

我的地址工厂

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Models\Address;
use Faker\Generator as Faker;

$factory->define(Address::class, function (Faker $faker) {
    return [
        'number'    => $faker->number,
        'street'    => $faker->streetName,
        'city'      => $faker->city,
        'state'     => $faker->state,
        'zip'       => $faker->postcode,
        'type'      => 'home',
        'contact_id'=> factory(App\Models\Contact::class),
    ];
});

联系模特

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use HasFactory;

    protected $fillable = [ 'firstName', 'lastName', 'email', 'phone', 'birthday' ];

    public function addresses()
    {
        return $this->hasMany('App\Models\Address');
    }
}

我的地址模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Address extends Model
{
    use HasFactory;
    protected $fillable = [ 'id', 'number', 'street', 'city', 'state', 'zip', 'type', 'contact_id' ];

    public function contacts()
    {
        return $this->belongsTo('App\Models\Contact');
    }
}

我试过了运行 作曲家转储自动 作曲家更新

None 这些正常修复似乎有效。

我真的不知道为什么会失败 预先感谢您的帮助

替换你的工厂函数factory('App\Models\Contact', 100)->create()

使用此代码:

\App\Models\Contact::factory()->count(100)
     ->create();

为什么?因为在 laravel 8 中删除了默认路由名称空间

在 Laravel8 中,您需要像下面这样更新您的工厂文件或将 laravel/legacy-factories 包添加到您的项目中。更多信息:https://laravel.com/docs/8.x/upgrade#model-factories

<?php

namespace Database\Factories;

use App\Models\Contact;
use Illuminate\Database\Eloquent\Factories\Factory;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Contact::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'firstName' => $this->faker->firstName,
            'lastName' => $this->faker->lastName,
            'email' => $this->faker->unique()->email,
            'phone' => $this->faker->phoneNumber,
            'birthday' => $this->faker->date($format = 'Y-m-d', $max = 'now')
        ];
    }
}

在播种机中使用这样的工厂:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class ContactTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        App\Models\Contact::factory()->create(100)
            ->each(function($contact) {
                $contact->addresses()->save(
                    App\Address::factory()->make()
                );
        });
    }
}

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

尝试改变

  factory(App\Models\Contact::class,100)->create();

\App\Models\Contact::factory()->create(); 
\App\Models\Contact::factory(100)->create(); \If you want to create 100 number of record then