[Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型
自定义type
根据官方文档,新建TinyIntType类,集成Type,并重写getName
,getSqlDeclaration
,convertToPHPValue
,getBindingType
等方法。
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] 数据库迁移组件的深入解析三:自定义数据字段类型相关推荐
- java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...
其实本来android前端定义的对象类型是对象,如果后台没有值的情况下,理论上给null,如果是数组给[]或者null都可以的.这样Gson再解析转换的时候就不会出问题!但是最近重构发现后台如果没有字 ...
- EF mysql 数据迁移_EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- oracle数据库迁移 增大空间,Oracle数据库迁移、创建表空间、创建数据表实例讲解-Oracle...
数据库迁移 对于数据库迁移来说,如果源数据库与目标数据库版本一致,推荐使用Oracle导入或者pl/sql导入:如果版本不一致,则可以使用sql导入的方式. 创建表空间 create tablespa ...
- Oracle数据库迁移问题(备份、还原、数据导入导出、PLSQL)IMP - 0009 错误
最近在做Oracle数据迁移,从一个服务器迁移到另外一台服务器上去,遇到各种问题,比如 导入DMP文件的时候,遇到 IMP - 0009 错误,折腾了半天,发现原来是我 连接到服务器导出DMP文件时, ...
- 逆袭之路——python 数据库字符编码与配置、存储引擎、字段类型及约束条件【day46】
今日内容概要 字符编码与配置文件介绍 存储引擎 MySQL字段类型 MySQL字段约束条件 今日内容详细 一. 字符编码与配置文件 # 查看MySQL默认字符编码\s""" ...
- Asp.Net MVC CodeFirst模式数据库迁移步骤
利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了,但是,我有新的类要加入,有字段需要修改,就得将这部分修改同步到数据库中,利用数据库迁移,将 ...
- 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库
In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...
- 数据库主备_数据库周刊40丨OceanBase官网上线开发者社区;人民日报关注易鲸捷;数据库迁移经验分享…...
摘要:墨天轮数据库周刊第40期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档.本周分享 OceanBase官网上线开发者社区:人民日报关注易鲸捷:2020中国系统架构师大会10月线上召 ...
最新文章
- 学建筑要学哪些计算机绘图,建筑学专业学CAD买什么书好?
- struts2文件下载出现Can not find a java.io.InputStream with the name的错误
- mongo的php查询,如何在php中查询mongo?
- 如何巧妙的使用ArrayList的Clone方法
- XCTF-MISC-新手区-如来十三掌
- python—while循环、字符串
- python 过滤文本中的标点符号(转)
- SegNet网络结构
- 基于JAVA+SpringMVC+Mybatis+MYSQL的企业客户管理系统
- 生活中的数学 —— 操场几何学
- 【暴力搜索】[HDU 1016]Prime Ring Problem
- Android同文输入法的使用(开源输入法Trime)
- js通过url链接下载文件
- MSP430 DM430-A开发板学习笔记(二)MSP430f149与hc06蓝牙模块的使用
- 计算机的ps快捷键,电脑快捷键和PS快捷键
- java jdk oracle官网历史版本下载链接
- Halcon视觉检测——使用分类器分类
- 解决您所有WiFi问题的10个智能路由器
- Chrome浏览器视频网站全屏黑屏解决方法
- Html5 文件上传