Сидеры
Сидер — класс, который заполняет таблицы данными: тестовыми статьями для разработки или обязательными записями вроде списка категорий. С ним пустая после миграций база за секунду получает содержимое, на котором можно проверять страницы. Сидеры лежат в папке app/Database/Seeds.
Создание сидера
php spark make:seeder PostSeederКоманда создаёт файл app/Database/Seeds/PostSeeder.php с пустым методом run(). Добавьте в него одну запись:
// app/Database/Seeds/PostSeeder.php
namespace App\Database\Seeds;
use CodeIgniter\Database\Seeder;
class PostSeeder extends Seeder
{
public function run()
{
$this->db->table('posts')->insert([
'title' => 'Первая статья',
'body' => 'Текст первой статьи.',
'status' => 1,
'created_at' => date('Y-m-d H:i:s'),
]);
}
}Свойство $this->db — подключение к базе. Метод table('posts') выбирает таблицу, insert() добавляет строку.
Запуск
php spark db:seed PostSeederТерминал сообщит, что сидер выполнен, а в таблице posts появится запись. Каждый запуск добавляет строки заново — сидер не проверяет, есть ли они уже.
Много записей
Несколько строк удобнее собрать в цикле и вставить одним запросом:
public function run()
{
$posts = [];
for ($i = 1; $i <= 20; $i++) {
$posts[] = [
'title' => "Статья №$i",
'body' => 'Текст статьи.',
'status' => $i % 3 === 0 ? 0 : 1,
'created_at' => date('Y-m-d H:i:s'),
];
}
$this->db->table('posts')->insertBatch($posts);
}insertBatch() принимает массив строк. В таблице окажется двадцать статей, каждая третья — со статусом 0, то есть черновик.
Несколько сидеров
Когда таблиц становится больше, создают главный сидер, который вызывает остальные в нужном порядке:
// app/Database/Seeds/DatabaseSeeder.php
namespace App\Database\Seeds;
use CodeIgniter\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call('UserSeeder');
$this->call('PostSeeder');
}
}Теперь всю базу заполняет одна команда: php spark db:seed DatabaseSeeder.
Начать с чистой базы
Во время разработки базу часто пересоздают целиком:
php spark migrate:refresh
php spark db:seed DatabaseSeederПервая команда удаляет и заново создаёт таблицы, вторая наполняет их.
Частая ошибка
Сидер не очищает таблицу: если запустить его дважды, записей станет вдвое больше, а при уникальных столбцах второй запуск закончится ошибкой. Перед повторным заполнением пересоздавайте таблицы командой migrate:refresh или очищайте таблицу в начале run() вызовом $this->db->table('posts')->truncate(). На рабочем сервере тестовые сидеры не запускают вовсе.