自定义type

根据官方文档,新建TinyIntType类,集成Type,并重写getNamegetSqlDeclarationconvertToPHPValuegetBindingType等方法。

TinyIntType.php完整代码:

<?php
namespace db\types;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
/*** 扩展DBAL组件类型** 迁移组件依赖的DBAL组件默认并不支持tinyint类型* 此类是为mysql支持tinyint类型而扩展的类** @author tangbo<admin@tbphp.net>*/
class TinyIntType extends Type
{public function getName(){return 'tinyint';}public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform){$sql = 'TINYINT';if (is_numeric($fieldDeclaration['length']) && $fieldDeclaration['length'] > 1) {$sql .= '(' . ((int) $fieldDeclaration['length']) . ')';} else {$sql .= '(3)';}if (!empty($fieldDeclaration['unsigned'])) {$sql .= ' UNSIGNED';}if (!empty($fieldDeclaration['autoincrement'])) {$sql .= ' AUTO_INCREMENT';}return $sql;}public function convertToPHPValue($value, AbstractPlatform $platform){return (null === $value) ? null : (int) $value;}public function getBindingType(){return ParameterType::INTEGER;}
}

其中getSqlDeclaration方法是用于生成sql语句,需要根据传入的参数处理sql拼接。

注册自定义类型

Type::addType(TinyIntType::TYPENAME, 'db\types\TinyIntType');
$connection->getDatabasePlatform()->registerDoctrineTypeMapping(TinyIntType::TYPENAME, TinyIntType::TYPENAME);

这样,你在编写迁移类代码的时候就可以使用tinyint了,例如:

public function up(Schema $schema): void
{$table = $schema->createTable('test1');$table->addColumn('id', 'integer')->setUnsigned(true)->setAutoincrement(true);$table->addColumn('status', 'tinyint')->setLength(2)->setDefault(1);$table->setPrimaryKey(['id']);
}

解决enum类型冲突

迁移组件不支持enum类型,也无法自定义该类型。如果集成迁移组件的时候数据库里已经存在表且有enum类型的字段,那么执行迁移命令时就会报错。

为了解决这个问题,我们需要把enum映射为string类型即可:

$connection->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

结语

至此,我们已经完成了迁移组件的所有迁移工作,并且已经能很好的在项目中使用它。

目前集成的是版本管理的方式,是迁移组件默认支持的,也是laravel框架集成的迁移方式。还有之前说到的另一种diff方式的迁移,diff方式能够更精准的控制表结构。

下一章我们来详细研究如何集成diff方式的数据迁移组件。

在我的代码库可以查看这篇文章的详细代码,欢迎star。

[Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型相关推荐

  1. java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...

    其实本来android前端定义的对象类型是对象,如果后台没有值的情况下,理论上给null,如果是数组给[]或者null都可以的.这样Gson再解析转换的时候就不会出问题!但是最近重构发现后台如果没有字 ...

  2. EF mysql 数据迁移_EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  3. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  4. oracle数据库迁移 增大空间,Oracle数据库迁移、创建表空间、创建数据表实例讲解-Oracle...

    数据库迁移 对于数据库迁移来说,如果源数据库与目标数据库版本一致,推荐使用Oracle导入或者pl/sql导入:如果版本不一致,则可以使用sql导入的方式. 创建表空间 create tablespa ...

  5. Oracle数据库迁移问题(备份、还原、数据导入导出、PLSQL)IMP - 0009 错误

    最近在做Oracle数据迁移,从一个服务器迁移到另外一台服务器上去,遇到各种问题,比如 导入DMP文件的时候,遇到 IMP - 0009 错误,折腾了半天,发现原来是我 连接到服务器导出DMP文件时, ...

  6. 逆袭之路——python 数据库字符编码与配置、存储引擎、字段类型及约束条件【day46】

    今日内容概要 字符编码与配置文件介绍 存储引擎 MySQL字段类型 MySQL字段约束条件 今日内容详细 一. 字符编码与配置文件 # 查看MySQL默认字符编码\s""" ...

  7. Asp.Net MVC CodeFirst模式数据库迁移步骤

    利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了,但是,我有新的类要加入,有字段需要修改,就得将这部分修改同步到数据库中,利用数据库迁移,将 ...

  8. 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库

    In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...

  9. 数据库主备_数据库周刊40丨OceanBase官网上线开发者社区;人民日报关注易鲸捷;数据库迁移经验分享…...

    摘要:墨天轮数据库周刊第40期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档.本周分享 OceanBase官网上线开发者社区:人民日报关注易鲸捷:2020中国系统架构师大会10月线上召 ...

最新文章

  1. 学建筑要学哪些计算机绘图,建筑学专业学CAD买什么书好?
  2. struts2文件下载出现Can not find a java.io.InputStream with the name的错误
  3. mongo的php查询,如何在php中查询mongo?
  4. 如何巧妙的使用ArrayList的Clone方法
  5. XCTF-MISC-新手区-如来十三掌
  6. python—while循环、字符串
  7. python 过滤文本中的标点符号(转)
  8. SegNet网络结构
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的企业客户管理系统
  10. 生活中的数学 —— 操场几何学
  11. 【暴力搜索】[HDU 1016]Prime Ring Problem
  12. Android同文输入法的使用(开源输入法Trime)
  13. js通过url链接下载文件
  14. MSP430 DM430-A开发板学习笔记(二)MSP430f149与hc06蓝牙模块的使用
  15. 计算机的ps快捷键,电脑快捷键和PS快捷键
  16. java jdk oracle官网历史版本下载链接
  17. Halcon视觉检测——使用分类器分类
  18. 解决您所有WiFi问题的10个智能路由器
  19. Chrome浏览器视频网站全屏黑屏解决方法
  20. Html5 文件上传

热门文章

  1. YAML开源库yaml-cpp简介及使用
  2. 【Qt】Qt再学习(七):QLocalServer、QLocalSocket
  3. 【POCO】POCO学习总结(三)——交叉编译
  4. Grape和Sinatra结合使用
  5. travis-ci如何配置android
  6. html使用highcharts绘制饼图,html js highcharts绘制圆饼图表
  7. 【eclipse】eclipse使用常见问题(持续更新)
  8. Vue.js 学习路线
  9. 使用JackJSON 流式API 创建JSON串【学习记录】
  10. 五分钟让你了解 Java方法(或者叫函数)