数据库: 数据填充
简介
Laravel 可以简单的使用 seed 类来给数据库填充测试数据。所有的 seed 类都放在 database/seeds 目录下。你可以任意地为 Seed 类命名,但是应该遵守某些大小写规范,可用类似 UserTableSeeder 之类的命名。 Laravle 默认为你定义了一个 DatabaseSeeder 类。你可以在这个类中使用 call 方法来运行其它的 seed 类,以借此控制数据填充的顺序。
译者注: 想从已有数据库中导出数据为 Seed 文件?见 【扩展推荐】将数据导出成 Seeder 文件
编写数据填充
你可以通过 make:seeder Artisan 命令 来生成一个 Seeder。所有通过框架生成的 Seeder 都将被放置在 database/seeders 路径:
php artisan make:seeder UsersTableSeeder在 seeder 类里只有一个默认方法:run。当运行 db:seed Artisan 命令 时就会调用此方法。你可以在 run 方法中给数据库添加任何数据。你可使用 查询语句构造器 或 Eloquent 模型工厂 来手动添加数据。
如下所示,我们将修改 Laravel 预先生成好的 DatabaseSeeder 类来给 run 方法添加一段可在数据库添加数据的语法:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
    /**
     * 运行数据库填充。
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}使用模型工厂
手动为每一个 seed 模型一一指定属性是很麻烦的一件事。作为替代方案,你可以使用 模型工厂 来帮助你更便捷的生成大量数据库数据。首先,阅读 模型工厂的文档 来学习如何定义你的工厂。一旦工厂被定义,就能使用 factory 这个辅助函数函数来添加数据到数据库。
让我们来创建 50 个用户并为每个用户创建一个关联:
/**
 * 运行数据库填充。
 *
 * @return void
 */
public function run()
{
    factory(App\User::class, 50)->create()->each(function($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}译者注:扩展阅读 - 大批量假数据填充的正确方法
调用其它的 Seeders
在 DatabaseSeeder 类中,你可以使用 call 方法来运行其它的 seed 类。为避免发生单个 seeder 类变得太大的情况,可使用 call方法来将数据填充拆分成多个文件。只需简单传递你想要运行的 seeder 类名称即可:
/**
 * 运行数据库填充。
 *
 * @return void
 */
public function run()
{
    Model::unguard();
    $this->call(UsersTableSeeder::class);
    $this->call(PostsTableSeeder::class);
    $this->call(CommentsTableSeeder::class);
    Model::reguard();
}运行数据填充
一旦你编写完 seeder 类,则可以使用 db:seed Artisan 命令来对数据库进行数据填充。在默认的情况下,db:seed 命令将运行 DatabaseSeeder 类,并通过它来调用其它的 seed 类。但是,你也可以使用 --class 选项来单独运行一个特定的 seeder 类:
php artisan db:seed
php artisan db:seed --class=UserTableSeeder你也可以使用 migrate:refresh 命令来对数据库进行数据填充,它会回滚并重新运行所有迁移。这在对数据库进行重构时非常有用:
php artisan migrate:refresh --seed{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译。
文档永久地址: http://d.laravel-china.org
 
             
                   Laravel 中文文档
                    Laravel 中文文档
                 Lumen 中文文档
                    Lumen 中文文档
                 Laravel 速查表
                    Laravel 速查表
                 Laravel 软件外包
                    Laravel 软件外包
                 Laravel 远程工作
                    Laravel 远程工作
                 PHP 之道
                    PHP 之道
                 Composer 镜像
                    Composer 镜像