laravel 模型工厂 简单使用

Laravel 使用填充类和测试数据提供了一个简单方法来填充数据到数据库。所有的填充类都位于 database/seeds目录。 填充类的类名完全由你自定义,但最好还是遵循一定的规则,比如可读性,例如 UserTableSeeder等等。安装完 Laravel 后,会默认提供一个DatabaseSeeder类。从这个类中,你可以使用 call方法来运行其他填充类,从而允许你控制填充顺序。


定义模型工厂 先在 database/factories/ModelFactory.php 文件中定义一个工厂:

$factory->define(App\Test::class, function (Faker\Generator $faker) {

    return [
        'name' => $faker->name,
        'airline' => $faker->unique()->randomNumber(),
        'description' => $faker->text(),
    ];
});

闭包内为工厂的定义,你可以返回模型中所有属性的默认测试值。在该闭包内会接收到 Faker PHP 函数库的实例,它可以让你很方便的生成各种随机数据以进行测试。 当然,你也可以随意将自己额外的工厂增加至 ModelFactory.php文件。你也可以在 database/factories里为每一个数据模型创建对应的工厂模型类,如 UserFactory.php和 CommentFactory.php。 在 factories目录中的文件都会被 Laravel 自动加载。 使用模型工厂 Laravel 安装时自带的 DatabaseSeeder 类,有添加一个数据库插入语句到 run 方法

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        factory(App\Test::class,5)->create();
    }
}

然后运行命令

php artisan migrate:refresh --seed

你也可以使用另一种方法单独填充数据 生成一个填充器,可以通过 Artisan 命令 make:seeder。所有框架生成的填充器都位于 database/seeders目录:

php artisan make:seeder TestTableSeeder

在run方法下调用定义的工厂

<?php

use Illuminate\Database\Seeder;

class TestTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        /*factory(App\Test::class, 50)->create()->each(function($test) {
            $test->posts()->save(factory(App\Test::class)->make());
        });*/
        factory(App\Test::class,3)->create();
    }
}

使用命令

php artisan db:seed --class=TestTableSeeder

模型关联# 在本例中,我们还会增加关联至我们所创建的模型。当使用 create方法创建多个模型时,它会返回一个 Eloquent 集合实例,让你能够使用集合所提供的便利函数,像是 each:

$users = factory(App\User::class, 3)
           ->create()
           ->each(function ($u) {
                $u->posts()->save(factory(App\Post::class)->make());
            });

你也可以使用闭包参数来创建模型关联。例如如果你想在创建一个 Post 的顺便创建一个 User 实例:

$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        }
    ];
});