Laravel 文档阅读:数据库之数据填充

翻译、衍生自:https://learnku.com/docs/laravel/5.4/seeding

简介

种子类(Seed Classes)保存在 database/seeds 目录。种子类的命名,使用像 UsersTableSeeder 这样的约定(Convention)方式。默认,已为你创建了一个名为 DatabaseSeeder 的类,在该类内部可以使用 call 方法调用其他种子类、控制种子类的执行顺序。

写种子

一个种子类就是一个种子(Seeder)。使用 Artisan 命令 make:seeder 创建种子,所有创建的种子保存在 database/seeds 目录。

php artisan make:seeder UsersTableSeeder

一个种子类默认仅包含一个方法:run。这个方法在执行 Artisan 命令 db:seed 时被调用。在 run 方法内部,定义向数据库插入数据的逻辑。你可以使用查询语句构造器(Query Builder)手动插入数据或者使用 Eloquent 模型工厂方法(Eloquent model factories)。

下面是使用查询语句构造器手动插入数据的例子:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

使用模型工厂方法

有时,使用查询语句构造器手动插入数据会很麻烦,比如插入的数据量很大时,那么这时就可以选择使用模型工厂方法。首先,定义好模型工厂方法,接着就可以使用 factory 辅助方法向数据库插入数据了。

下面我们创建了 50 个用户并为每个用户伪造了一篇博文。

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    factory(App\Models\User::class, 50)->create()->each(function ($u) {
        $u->posts()->save(factory(App\Models\Post::class)->make());
    });
}

调用种子类

已经说过,在 DatabaseSeeder 类内部使用 call 方法调用种子类。

使用种子类的好处:可以将向数据库填充数据的逻辑拆分到多个文件里,从而避免将填充数据的逻辑统一写在一个文件里造成的文件过于巨大的问题。并且,你可以使用 call 方法、更加细粒度地、有选择地调用种子类,并控制种子类的执行顺序。

下面是一个例子:

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $this->call(UsersTableSeeder::class);
    $this->call(PostsTableSeeder::class);
    $this->call(CommentsTableSeeder::class);
}

执行种子

一旦写好种子类,或者在 DatabaseSeeder 类中定义好了调用种子类的逻辑,就可以使用 Artisan 命令 db:seed 执行种子、向数据库填充数据了。

Artisan 命令 db:seed 默认运行 DatabaseSeeder 类;当然也可以使用 --class 选项指定要运行的种子类。

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

也可以在运行 migrate:refresh 命令时,通过指定 --seed 选项的方式填充数据。

php artisan migrate:refresh --seed

这句命令表示:还原&重新执行所有迁移,完成后再向数据库填充数据。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!