# 数据库填充

数据库填充是向数据库添加数据的简便方法。这在开发期间特别有用，可用于填充开发所需的样本数据，但不限于此。数据库填充可包含不希望放入迁移文件中的静态数据，例如国家列表、地理编码表、事件或设置信息等。

## 数据库填充类

数据库填充类是必须包含 `run()` 方法且继承自 `CodeIgniter\Database\Seeder` 的简单类。在 `run()` 方法中，该类可以创建所需的任何形式的数据。可分别通过 `$this->db` 和 `$this->forge` 使用数据库连接和 Forge 类。填充文件必须存放在 app/Database/Seeds 目录下，且文件名必须与类名匹配。

    <?php

    namespace App\Database\Seeds;

    use CodeIgniter\Database\Seeder;

    class SimpleSeeder extends Seeder
    {
        public function run()
        {
            $data = [
                'username' => 'darth',
                'email'    => 'darth@theempire.com',
            ];

            // Simple Queries
            $this->db->query('INSERT INTO users (username, email) VALUES(:username:, :email:)', $data);

            // Using Query Builder
            $this->db->table('users')->insert($data);
        }
    }

## 嵌套填充

可使用 `call()` 方法调用其他填充类。由此可轻松组织一个中心填充类，并将具体任务拆分到独立的填充文件中：

    <?php

    namespace App\Database\Seeds;

    use CodeIgniter\Database\Seeder;

    class TestSeeder extends Seeder
    {
        public function run()
        {
            $this->call('UserSeeder');
            $this->call('CountrySeeder');
            $this->call('JobSeeder');
        }
    }

`call()` 方法也支持完全限定类名，这样就能将填充类放置在自动加载器可找到的任何位置。这对于模块化代码库非常有用：

    <?php

    namespace App\Database\Seeds;

    use CodeIgniter\Database\Seeder;

    class SimpleSeeder extends Seeder
    {
        public function run()
        {
            $this->call('UserSeeder');
            $this->call('My\Database\Seeds\CountrySeeder');
        }
    }

## 使用填充类

可通过数据库配置类获取主填充类的实例：

    <?php

    $seeder = \Config\Database::seeder();
    $seeder->call('TestSeeder');

### 使用不同的数据库组

获取填充类实例时，可通过第一个参数指定不同的数据库组名称：

    <?php

    $seeder = \Config\Database::seeder('group_name');
    $seeder->call('TestSeeder');

使用 `call()` 运行子填充类时，数据库连接会自动传递。这意味着除非子填充类显式设置了自身的 `$DBGroup` 属性，否则将使用与父类相同的连接。

如果填充类无论父类连接如何都必须使用特定数据库组，可在类中设置 `$DBGroup` 属性：

    <?php

    namespace App\Database\Seeds;

    use CodeIgniter\Database\Seeder;

    class UserSeeder extends Seeder
    {
        protected $DBGroup = 'group_name';

        public function run()
        {
            // ...
        }
    }

连接优先级如下：

1. 若在填充类中设置了 `$DBGroup`，则始终使用该连接组。

2. 否则，若传递了连接（来自父类的 `call()` 或 `Database::seeder()`），则使用该连接。

3. 否则，使用默认连接组。

### 命令行填充

如果不希望创建专门的控制器，也可作为迁移 CLI 工具的一部分，通过命令行填充数据：

    php spark db:seed TestSeeder

## 创建填充文件

使用命令行可轻松生成填充文件：

    php spark make:seeder user --suffix

上述命令将在 app/Database/Seeds 目录下生成 UserSeeder.php 文件。

通过 `--namespace` 选项可指定存放填充文件的根命名空间：

Unix 环境：

    php spark make:seeder MySeeder --namespace Acme\\Blog

Windows 环境：

    php spark make:seeder MySeeder --namespace Acme\Blog

若 `Acme\Blog` 映射到 app/Blog 目录，则此命令将在 app/Blog/Database/Seeds 目录下生成 MySeeder.php。

使用 `--force` 选项将覆盖目标位置的现有文件。