thedoctor0/laravel-factory-generator

Automatically generate Laravel factories for your models.

1.2.3 2022-08-14 11:02 UTC

This package is auto-updated.

Last update: 2022-11-19 22:11:00 UTC


README

Packagist Packagist License

Banner

Automatically generate factories from your existing models.

It will allow you to write tests containing your models much faster.

Installation

You can install the package via composer:

composer require thedoctor0/laravel-factory-generator --dev

Usage

To generate all factories at once, simply run this artisan command:

php artisan generate:factory

It will find all models and generate test factories based on the database structure and model relations.

Example

Migration and Model

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('username');
    $table->string('email')->unique();
    $table->string('password', 60);
    $table->integer('company_id');
    $table->rememberToken();
    $table->timestamps();
});

class User extends Model {
    public function company()
    {
        return $this->belongsTo(Company::class);
    }
}

Generated Factory

For Laravel 6.x and 7.x:

<?php

declare(strict_types=1);

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'username' => $faker->userName,
        'email' => $faker->safeEmail,
        'password' => bcrypt($faker->password),
        'company_id' => factory(App\Company::class),
        'remember_token' => Str::random(10),
    ];
});

For Laravel 8.x and up:

<?php

declare(strict_types=1);

namespace Database\Factories;

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

/**
 * @extends Factory<\App\Models\User>
 */
final class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition(): array
    {
        return [
            'name' => $this->faker->name,
            'username' => $this->faker->userName,
            'email' => $this->faker->safeEmail,
            'password' => bcrypt($this->faker->password),
            'company_id' => \App\Company::factory(),
            'remember_token' => Str::random(10),
        ];
    }
}

Advanced usage

To generate a factory for only specific model or models, run the artisan command:

php artisan generate:factory User Company

By default, generation will not overwrite any existing model factories.

You can force overwriting existing model factories by using the --force option:

php artisan generate:factory --force

By default, it will search recursively for models under the app/Models (Laravel 8.x and up) or app for (Laravel 6.x and 7.x).

If your models are within a different folder, you can specify this using --dir option.

In this case, run the artisan command:

php artisan generate:factory --dir app/Models

If your models are within a different namespace, you can specify it using --namespace option.

You just need to execute this artisan command:

php artisan generate:factory --dir vendor/package/src/Models --namespace CustomNamespace\\Models

By default, your model directory structure is not taken into account, even though it has subdirectories.

You can reflect it to database/factories directory by using the --recursive option:

php artisan generate:factory --recursive

License

The MIT License (MIT). Please see license file for more information.