Encodera

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

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

Оглавление

Сидеры и фабрики

Пустой блог неудобно разрабатывать: чтобы проверить список или постраничный вывод, нужны статьи. Сидер — класс, который записывает в базу начальные данные. Фабрика — описание того, как создать модель со случайными, но правдоподобными значениями. Вместе они наполняют базу за секунду.

Сидер

node ace make:seeder post

Появится файл database/seeders/post_seeder.ts. Запишите в метод run пару статей:

// database/seeders/post_seeder.ts
import { BaseSeeder } from '@adonisjs/lucid/seeders'
import Post from '#models/post'
 
export default class extends BaseSeeder {
  async run() {
    await Post.createMany([
      { title: 'Добро пожаловать', body: 'Первая статья блога.', isPublished: true },
      { title: 'О проекте', body: 'Блог написан на AdonisJS.', isPublished: true },
    ])
  }
}

Запустите все сидеры:

node ace db:seed

В таблице posts появятся две статьи — откройте /posts и убедитесь.

Фабрика

Когда нужно много записей, писать их руками долго. Создайте фабрику:

node ace make:factory post
// database/factories/post_factory.ts
import factory from '@adonisjs/lucid/factories'
import Post from '#models/post'
 
export const PostFactory = factory
  .define(Post, async ({ faker }) => {
    return {
      title: faker.lorem.sentence(),
      body: faker.lorem.paragraphs(3),
      isPublished: true,
    }
  })
  .build()

Функция получает объект faker из библиотеки Faker, которая генерирует случайные тексты, имена и адреса. Каждый вызов фабрики даёт новые значения.

Фабрика в сидере

// database/seeders/post_seeder.ts
import { BaseSeeder } from '@adonisjs/lucid/seeders'
import { PostFactory } from '#database/factories/post_factory'
 
export default class extends BaseSeeder {
  async run() {
    await PostFactory.createMany(30)
  }
}

После node ace db:seed в блоге будет 30 статей — достаточно, чтобы проверить три страницы по десять.

Связанные записи

Создайте CommentFactory так же, затем укажите связь в фабрике статей:

// database/factories/post_factory.ts
import { CommentFactory } from '#database/factories/comment_factory'
 
export const PostFactory = factory
  .define(Post, async ({ faker }) => ({
    title: faker.lorem.sentence(),
    body: faker.lorem.paragraphs(3),
    isPublished: true,
  }))
  .relation('comments', () => CommentFactory)
  .build()
// database/seeders/post_seeder.ts
await PostFactory.with('comments', 3).createMany(10)

Получится 10 статей, у каждой по три комментария. Внешний ключ postId фабрика заполнит сама.

Пересоздание базы

Чтобы начать с чистой базы, удобна одна команда:

node ace migration:fresh --seed

Она удалит все таблицы, применит миграции заново и запустит сидеры.

Частая ошибка

db:seed запускает все сидеры при каждом вызове, поэтому повторный запуск добавит те же статьи ещё раз. Для разработки пересоздавайте базу через migration:fresh --seed. И никогда не запускайте сидеры с тестовыми данными на рабочем сервере.

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

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