Skip to content

迁移字段与索引(LimsSchema)

对齐遗留 huayan/app/auto_patch + LIMS_Base 的国产库/MySQL 版本差异,beta 新表迁移统一用本套辅助。

检测

DatabaseCapabilities 读取:

  • config('legacy.db.legacy_dbtype')(来自 .envsdbtype
  • Schema::getConnection()->getDriverName()mysql / dm / pgsql / kingbase
  • MySQL 时 getServerVersion()(5.5 vs 5.6+)

迁移写法

php
Schema::create('example', function (Blueprint $table) {
    $table->id();
    $table->string('name', 64);
    $table->text('payload')->nullable();

    // 时间:自动 datetime/timestamp + useCurrent
    $table->limsCreatedAt();
    $table->limsUpdatedAt();           // 可空,应用维护
    $table->limsUpdateTime();          // 遗留 update_time;dm 需额外触发器

    // JSON:MySQL 用 json,达梦/金仓用 text
    $table->limsNullableJson('meta');

    // 索引:达梦对 text/clob 列可传 types 跳过
    $table->limsIndex(['name', 'created_at'], 'example_idx_name_time');
    $table->limsIndexes([
        ['name' => 'example_idx_biz', 'columns' => ['biz_type', 'biz_id']],
    ]);
    $table->limsFullText(['title']);   // 非 MySQL 自动跳过
});

up() 末尾若使用 limsUpdateTime() 且为达梦:

php
LimsSchema::applyDamengUpdateTimeTrigger('example');

down()

php
LimsSchema::dropDamengUpdateTimeTrigger('example');

规则摘要

MySQL ≥5.6MySQL 5.5达梦 dm瀚高 hg金仓 kdb
连接mysqlmysqldm + dmlaravelpgsql:kdb: + KingbaseGrammar
默认时间列datetimetimestampGrammartimestamp/datetime同 PG 系
ON UPDATE支持单列限制触发器应用层应用层(Grammar 忽略 ON UPDATE)
FULLTEXT支持支持跳过跳过跳过
text 列索引慎用慎用跳过(传 types)慎用跳过(传 types,同达梦策略)

金仓(dbtype=kdb)

  • 不能改用 DB_CONNECTION=pgsql;必须 kingbase 连接 + 金仓 kdb PDO 扩展。
  • Schema:KingbaseConnection + KingbaseSchemaGrammar(继承 PostgresGrammar)。
  • 连接后执行 set sql_mode=''(对齐 ksqli.php)。
  • 迁移继续用 limsCreatedAt / limsIndexlimsUpdateTime 不会生成 ON UPDATE。
  • 业务 SQL 的 MySQL 函数改写仍在遗留 ksqli.php 层,Laravel 查询层后续可再封装。

类位置

  • App\Foundation\Schema\DatabaseCapabilities
  • App\Foundation\Schema\LimsSchema
  • 宏注册:App\Providers\LimsSchemaServiceProvider