oniichann / cheap-sql-scheme
Визуальный редактор схем БД для Laravel: таблицы, колонки и связи на холсте, импорт из SQL-дампа или миграций, экспорт в миграции Laravel и .sql для MySQL, PostgreSQL и SQLite.
Package info
github.com/ONIIIIICHANNN/cheap-sql-scheme
Language:TypeScript
pkg:composer/oniichann/cheap-sql-scheme
Requires
- php: ^8.2
- ext-zip: *
- illuminate/database: ^11.0|^12.0|^13.0
- illuminate/http: ^11.0|^12.0|^13.0
- illuminate/routing: ^11.0|^12.0|^13.0
- illuminate/support: ^11.0|^12.0|^13.0
- phpmyadmin/sql-parser: ^5.9|^6.0
Requires (Dev)
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
- pestphp/pest-plugin-laravel: ^3.0|^4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Визуальный редактор схем базы данных для Laravel. Ставится одной командой и открывается в браузере.
- таблицы, колонки и связи на холсте; связь тянется мышкой от колонки к колонке;
- PK, unique, index, nullable, автоинкремент, значения по умолчанию, перетаскивание колонок;
- мягкие или прямые линии, цветные зоны, выделение рамкой;
- импорт из SQL-дампа (в том числе phpMyAdmin) или из миграций Laravel;
- экспорт в одну миграцию Laravel, в миграции по файлу на таблицу (ZIP, в порядке зависимостей) или в
.sqlдля MySQL, PostgreSQL и SQLite; - схема твоей базы сразу после установки — редактор сам читает структуру базы проекта;
- коммиты как в git — меняешь схему на холсте, видишь зелёным/красным/жёлтым, что поменялось, и получаешь миграцию только с изменениями (
renameColumn,->change(),dropColumn, ключи) с рабочимdown(); - «Save to project» — миграции записываются прямо в
database/migrations, останется выполнитьphp artisan migrate; - английский (по умолчанию) и русский интерфейс, автосохранение, светлая и тёмная тема.
Установка
composer require oniichann/cheap-sql-scheme php artisan migrate
Готово: откройте /sql-schemes.
Node.js не нужен: интерфейс уже собран и лежит в dist/, Laravel отдаёт его сам.
Требования
- PHP 8.2+, расширение
zip - Laravel 11, 12 или 13
Кто может открыть редактор
По умолчанию — все. Закрыть его решает ваше приложение, например в AppServiceProvider::boot():
use CheapSqlScheme\CheapSqlScheme; // Только в локальной разработке: CheapSqlScheme::auth(fn ($request) => app()->environment('local')); // Только админам: CheapSqlScheme::auth(fn ($request) => $request->user()?->is_admin); // Через Gate: CheapSqlScheme::auth(fn ($request) => Gate::allows('viewSqlSchemes'));
Можно и через middleware в конфиге: 'middleware' => ['web', 'auth'].
Все, кого пустили, работают в общем пространстве и видят все схемы. Если залогиненный пользователь должен видеть только свои, включите 'per_user' => true. Автор схемы запоминается в sql_schemas.user_id, если при создании кто-то был залогинен.
Настройка
php artisan vendor:publish --tag=cheap-sql-scheme-config
config/cheap-sql-scheme.php:
| Ключ | По умолчанию | Что делает |
|---|---|---|
path |
sql-schemes |
Адрес редактора; API живёт под /{path}/api |
locale |
en |
Язык интерфейса: en или ru |
middleware |
['web'] |
Middleware интерфейса и API; например, ['web', 'auth'] |
per_user |
false |
true — залогиненный видит только свои схемы |
back_url |
/ |
Куда ведёт «← Назад» со списка схем; null прячет кнопку |
user_model |
null |
Модель автора для SqlSchema::user(); null берёт auth.providers.users.model |
import_max_kb |
5120 |
Максимальный размер импортируемого файла |
save_migrations |
null |
Кнопка «Save to project»: null — только в local, true/false — везде вкл/выкл |
migrations_path |
null |
Куда писать миграции; null — database/migrations |
project_schema.enabled |
true |
Создавать схему базы проекта при первом открытии |
project_schema.connection |
null |
Соединение для чтения структуры; null — по умолчанию |
project_schema.exclude |
служебные | Таблицы, которых нет в схеме проекта |
Основное можно поменять и без публикации конфига, через .env:
CHEAP_SQL_SCHEME_PATH=db-designer CHEAP_SQL_SCHEME_LOCALE=ru CHEAP_SQL_SCHEME_SAVE_MIGRATIONS=false
Схема проекта и коммиты
При первом открытии редактор читает структуру базы приложения (таблицы, колонки, одноколоночные индексы, внешние ключи) и создаёт схему «{APP_NAME} database». Служебные таблицы Laravel и таблицы пакета в неё не попадают — список в project_schema.exclude. Кнопка Refresh from database обновляет схему из базы, сохраняя положение таблиц на холсте.
Дальше всё как в git:
- Меняешь схему на холсте. Новые колонки отмечаются зелёным, изменённые — жёлтым, в шапке растёт счётчик Changes · N.
- Changes открывает окно коммита: по каждой таблице видно, что добавлено, удалено, изменено (было → стало) и переименовано, а на вкладке Migration — сама миграция.
- Commit to project записывает её в
database/migrations(или Commit & download — скачать файл). Следующий коммит покажет только то, что поменялось после этого.
Что попадает в миграцию:
| На холсте | В миграции |
|---|---|
| новая таблица | Schema::create(...) |
| переименовали таблицу | Schema::rename(...) |
| удалили таблицу | Schema::dropIfExists(...) |
| новая колонка | $table->string('x')... |
| переименовали колонку | $table->renameColumn(...) — данные сохраняются |
| поменяли тип, nullable, default | ...->change() |
| удалили колонку | $table->dropColumn(...) |
| unique / index | unique() / dropUnique(), index() / dropIndex() |
| связь | foreign(...) / dropForeign(...) |
Таблицы и колонки опознаются по внутреннему id, а не по имени, поэтому переименование всегда остаётся переименованием, а не «удалить и создать заново». down() откатывает всё обратно.
Если база изменилась в обход редактора
Миграции не обязательно делать через редактор. Если их выполнили обычным php artisan migrate или поправили базу руками, редактор это заметит: при открытии схемы проекта и при возврате во вкладку он сверяет базу с последним коммитом. Если что-то разошлось, над холстом появляется плашка «The database changed outside the editor» со счётчиком изменений, кнопкой Details (что именно поменялось) и Refresh (подтянуть структуру из базы). Та же кнопка всегда есть в шапке: Refresh from database.
Сверка идёт «по смыслу». То, что база хранит по-своему (varchar(255) вместо string, datetime вместо timestamp в SQLite, 1 вместо true), изменением не считается. Пока в проекте есть невыполненные миграции, база законно отстаёт от схемы, и сверка не делается.
Окно коммита предупреждает:
- о невыполненных миграциях проекта (сверка с таблицей
migrations) — сначала стоит выполнитьphp artisan migrate; - о новых NOT NULL колонках без default в существующих таблицах — такая миграция упадёт, если в таблице есть строки;
- об удалении таблиц и колонок — вместе с ними удаляются данные.
Не поддерживаются: составные индексы и внешние ключи (их редактор не трогает), смена первичного ключа.
Запись миграций в проект
В окне экспорта есть кнопка Save to project. Она пишет миграции по файлу на таблицу прямо в database/migrations в порядке зависимостей, с текущей меткой времени, так что они встают после уже существующих. Дальше — обычный php artisan migrate.
- Если у таблиц уже есть миграции с тем же именем (
create_users_table.php), редактор покажет их список и перезапишет только после подтверждения. - Имена таблиц и колонок попадают в PHP-код миграции, поэтому в проект записываются только обычные идентификаторы (латиница, цифры,
_). - По умолчанию кнопка работает только в
local-окружении: на проде браузер в код приложения не пишет.
Другие публикации:
php artisan vendor:publish --tag=cheap-sql-scheme-migrations # миграции к себе в проект php artisan vendor:publish --tag=cheap-sql-scheme-views # Blade-обёртка страницы
Таблицы
Пакет создаёт sql_schemas, sql_tables, sql_columns и sql_relations.
Разработка
composer install composer test # тесты Pest на Testbench cd resources/js npm install npm run build # пересобрать интерфейс в dist/
Собранный dist/ коммитится вместе с кодом: его получают те, кто ставит пакет.
Лицензия
MIT