数据库填充
数据库填充是向数据库添加数据的简便方法。这在开发期间特别有用,可用于填充开发所需的样本数据,但不限于此。数据库填充可包含不希望放入迁移文件中的静态数据,例如国家列表、地理编码表、事件或设置信息等。
数据库填充类
数据库填充类是必须包含 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()
{
// ...
}
}
连接优先级如下:
若在填充类中设置了
$DBGroup,则始终使用该连接组。否则,若传递了连接(来自父类的
call()或Database::seeder()),则使用该连接。否则,使用默认连接组。
命令行填充
如果不希望创建专门的控制器,也可作为迁移 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 选项将覆盖目标位置的现有文件。