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

news/2024/9/17 16:05:35

自定义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。

http://lihuaxi.xjx100.cn/news/237937.html

相关文章

(转)如何修改maven的默认jdk版本

背景&#xff1a;在maven的配置文件中配置编译的jdk插件&#xff0c;就不需要在eclipse中进行重新的指定了。 问题 1、创建maven项目的时候&#xff0c;jdk版本是1.5版本&#xff0c;而自己安装的是1.7或者1.8版本。 2、每次右键项目名-maven->update project 时候&#xff…

区块链在未来是否还有前途?

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;区块链协议概述&#xff08;第二部分&#xff09; 简化付款确认 可以在不运行完整网络节点的情况下验证支付。用户只需要保存最长的工作证明链的块头副本&…

Django模板过滤器详解

Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的&#xff0c;如显示格式的转换、判断处理等。以下是 Django 过滤器列表&#xff0c;希望对为大家的开发带来一些方便。 一、形式&#xff1a;小写   {{ name | lower }} 二、串联&#xff1a;先转义文…

小程序这件事 撸起袖子加油干

写在前面的话&#xff1a; 初次接触小程序&#xff0c;便被它开发的简易与便捷所吸引。总按耐不住对未知的探索欲望&#xff0c;于是乎撸起袖子来干一个吧。附&#xff1a;小程序开发文档 项目介绍 艺龙酒店小程序实践 使用<swiper>标签实现网页轮播图的效果&#xff0c;…

区块链社交APP协议分析:Qbao

“ 本文从协议解析的角度&#xff0c;对区块链社交应用Qbao进行简单分析&#xff0c;重点介绍聊天内容的还原。”在正文开始前&#xff0c;先作几点说明&#xff1a;首先&#xff0c;Qbao不是钱宝&#xff0c;而是一款区块链社交APP&#xff0c;请钱宝粉勿扰。其次&#xff0c;…

在学习技术知识时候,到底什么是学习变革的催化剂?

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;区块链技术如何成为自适应学习变革的催化剂 区块链技术是第四次工业革命的一部分&#xff0c;用于创造加密货币比特币。该技术涉及到存储在各个节点中的记录。…

Maven教程

2019独角兽企业重金招聘Python工程师标准>>> mavn jar 包搜索仓库地址&#xff1a;http://www.mvnrepository.com/ 转载于:https://my.oschina.net/qimhkaiyuan/blog/1592565

ActiveMQ5.14.5配置参数详解

Activemq-.xml1.加载properties配置参数。下面加载是访问broker的身份信息&#xff0c;即用户名和密码 <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name"locations"><value>file:…