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

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

原文地址:https://www.cnblogs.com/tbphp/p/9163982.html

时间: 2024-11-03 22:16:51

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

[Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件

场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结构与实际数据库中的表结构进行对比的方式进行数据迁移.这种方式比之前版本管理的方式更加精准也更方便. Symfony框架是自身ORM组件支持,但是很多项目并没有使用其中的ORM功能,或者有自己的ORM组件,又该如何集成diff方式的迁移呢?下面我们就来完成这个任务. 源码解析 在研究组件源码时,发现一

[Doctrine Migrations] 数据库迁移组件的深入解析一:安装与使用

场景分析 团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高.而且在多个开发者之间数据结构同步也是很大的问题.Doctrine Migrations组件把数据库变更加入到代码中和代码一起进行版本管理,很好的解决了上述问题. Doctrine Migrations是基于Doctrine DBAL组件的数据迁移组件.集成于Laravel,Symfony等主流框架.大概可以分为两种方式进行迁移,即版本管理方式和diff方式. 版本管理:把数据库变更写入到代码中,来

EFCodeFirst Migrations数据库迁移

EFCodeFirst Migrations数据库迁移 数据库迁移 1.生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置. static PortalContext() {  Database.SetInitializer<PortalContext>(null);  }  添加Migrations文件夹,并生成类文件Configuration.cs. namespace Portal.Migrations { 

EF Code First Migrations数据库迁移

http://www.cnblogs.com/libingql/p/3330880.html 1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramework. PM> Install-Package EntityFramework 安装成功后,界面提示如下图: 在新建的Portal控制台应用程序中添加两个实体类,代码结构如下: 其中,类文件PortalCo

【EF】EF Code First Migrations数据库迁移

1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramework. PM> Install-Package EntityFramework 安装成功后,界面提示如下图: 在新建的Portal控制台应用程序中添加两个实体类,代码结构如下: 其中,类文件PortalContext.cs的代码如下: using System; using System.Colle

【EF Code First】Migrations数据库迁移

1,打开工具->NuGet程序管理器->程序包管理器控制台 默认项目中要选择  数据访问上下文类  所在的项目 我的DB是在命名空间CodeFirst.UI下的所以选择CodeFirst.UI 然后执行Enable-Migrations 如果失败,有一种错误是会提醒你未安装XXXX或者缺少XXXX(遇到过一次,错误信息未保留,下次有机会补充), 需要安装 (不知道是什么鬼东西): 去官网上下载安装可以了http://www.microsoft.com/zh-cn/download/detail

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

最近在做Oracle数据迁移,从一个服务器迁移到另外一台服务器上去,遇到各种问题,比如 导入DMP文件的时候,遇到 IMP - 0009 错误,折腾了半天,发现原来是我 连接到服务器导出DMP文件时,用的Oracle客户端版本与服务器上Oracle版本不一致,导致导出来的DMP文件实际上有损坏,所以怎么都不能导入到新服务器的Oracle数据库中去. 总结:最好严格保证Oracle版本及环境一致性,免得遇到各种问题.

highcharts图表组件通过设置tooltip属性自定义数据提示信息

$(function () { $('#container').highcharts({ chart: { }, xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }, tooltip: { shared: true, //是否共享提示,也就是X一样的所有点都显示出来 useHTML: true, //是否使用HTML编辑提示信息 he

ASP.NET MVC5--为数据库新增字段(涉及数据库迁移技术)

Setting up Code First Migrations for Model Changes--为模型更改做数据库迁移. 1.打开资源管理器,在App_Data文件夹下,找到movies.mdf数据库文件,如果没有看到点击显示所有文件. 2.删掉movies.mdf数据库文件,并编译项目.确保没有报错. 3.找到工具菜单栏下面的NuGet程序包管理器---程序包管理器控制台,如图所示: 4,在程序包管理器控制台中,输入:Enable-Migrations -ContextTypeName