Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сидеры

Сидер — класс, который заполняет таблицы данными: тестовыми статьями для разработки или обязательными записями вроде списка категорий. С ним пустая после миграций база за секунду получает содержимое, на котором можно проверять страницы. Сидеры лежат в папке 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(). На рабочем сервере тестовые сидеры не запускают вовсе.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.