Перейти к основному содержимому

Миграции и модель данных

Главная особенность

Базовая схема проекта создаётся через SQL-дамп database/initial_schema.mysql.

Первая миграция database/migrations/0001_01_01_000000_create_initial_schema_and_put_values.php загружает этот dump. После этого Laravel накатывает дельты из database/migrations.

Это значит: нельзя восстановить полноценную БД, глядя только на маленькие миграции. Источник истины для начального состояния — dump.

Структура database

ПутьНазначение
database/initial_schema.mysqlНачальная схема и часть reference data
database/migrations/*Актуальные дельты поверх dump
database/old_migrations/*Архив старого миграционного пути
database/settings/*Spatie settings migrations
database/seeders/*Ограниченные backfill seeders

Основные группы таблиц

Laravel/runtime

  • users;
  • password_reset_tokens;
  • sessions;
  • cache;
  • cache_locks;
  • jobs;
  • job_batches;
  • failed_jobs.

Permissions

  • roles;
  • permissions;
  • model_has_roles;
  • model_has_permissions;
  • role_has_permissions.

Проект использует Spatie Permission с custom Role model.

Education/Academy

  • academic_years;
  • weeks;
  • grades;
  • rooms;
  • teachers.

Эти таблицы нужны для учебного календаря, расписания, классов и учебных групп.

Education/Program

  • subjects;
  • subsubjects;
  • difficulty_levels;
  • difficulty_level_grade;
  • difficulty_levels_tree;
  • topics;
  • topic_modules.

Это основа roadmap и программ.

Education/Catalog

  • products;
  • product_cards;
  • product_pages;
  • product_offerings;
  • product_lessons;
  • product_lesson_topic;
  • tariffs;
  • tariff_movements;
  • tariff_movement_conditions;
  • series;
  • series_elements;
  • offerings;
  • offering_elements.

Education/Dictionary

  • product_types;
  • product_subtypes;
  • product_formats;
  • product_goals;
  • product_page_statuses;
  • product_price_statuses;
  • product_offering_statuses;
  • product_lesson_types;
  • tariff_types.

Education/Learning

  • groups;
  • group_disciplines;
  • group_lessons;
  • schedules.

Landing/site

  • landing_redirects;
  • landing_layouts;
  • landing_proxy_pages;
  • landing_null_prefix_pages;
  • landing_page_cache_entries;
  • landing_banners;
  • landing_banner_types;
  • catalog_filters;
  • catalog_seo_phrases.

Roadmap landing config

  • subject_roadmap_configs;
  • difficulty_level_roadmap_configs;
  • mini_group_programs;
  • mini_group_modules;
  • mini_group_module_topic.

Settings

  • settings table used by Spatie settings.
  • SaleStateSettings group: sale_state.

Seeders

DatabaseSeeder вызывает:

  • LandingProductsSeeder;
  • LandingProductCardsSeeder.

Эти seeders не создают всю базу с нуля. Они дозаполняют product_pages и product_cards для уже существующих products.

Data migrations

В проекте есть миграции, которые не только меняют схему, но и создают/меняют данные.

Важные примеры:

  • создание product_offering_statuses;
  • создание transitions для statuses;
  • создание special tariffs;
  • чистка landing_page_cache_entries;
  • добавление product subtypes/goals/price statuses;
  • добавление roadmap/program structures.

Перед откатом таких миграций нужно понимать не только DDL, но и бизнес-данные.

Правила безопасного изменения БД

  1. Не редактировать initial_schema.mysql для обычной фичи, если проект уже развёрнут. Делать новую migration.
  2. Если меняется reference data, явно описывать это в migration.
  3. Учитывать model side effects, если данные меняются через Eloquent.
  4. Если данные меняются SQL-ом, вручную синхронизировать derived fields.
  5. Для product_offerings особенно осторожно менять actual, status_id, tariff_id, даты.
  6. Для roadmap не забывать config tables и visibility flags.
  7. Для proxy pages учитывать, что изменение landing_proxy_pages меняет публичные routes.