资讯专栏INFORMATION COLUMN

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

ysl_unh / 1813人阅读

摘要:自定义根据官方文档,新建类,集成,并重写,,,等方法。如果集成迁移组件的时候数据库里已经存在表且有类型的字段,那么执行迁移命令时就会报错。下一章我们来详细研究如何集成方式的数据迁移组件。

自定义type

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

TinyIntType.php完整代码:


 */
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	ypesTinyIntType");
$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.ucloud.cn/yun/28796.html

相关文章

  • [Doctrine Migrations] 数据迁移组件深入解析二:定义集成

    摘要:结语到此,数据迁移组件就已经很灵活的集成到我们自己的项目中了,而且你还可以根据自己的项目灵活修改自定义命令脚本文件。但是如果使用久了会发现现在的数据迁移会有两个问题不支持类型,在相关中,官方开发人员有回复所以只能添加自定义类型。 自定义命令脚本 目录结构 目前的项目结构是这样的(参照代码库): showImg(https://segmentfault.com/img/remote/14...

    luoyibu 评论0 收藏0
  • [Doctrine Migrations]数据迁移组件深入解析一:安装与使用

    摘要:是基于组件的数据迁移组件。版本管理把数据库变更写入到代码中,来进行版本管理。此系列文章不讨论现有框架中数据迁移组件的使用,而是着重于探讨如何单独使用迁移组件以及如何把数据迁移组件集成到自己的项目个性化定制。 场景分析 团队开发中,每个开发人员对于数据库都修改都必须手动记录,上线时需要人工整理,运维成本极高。而且在多个开发者之间数据结构同步也是很大的问题。Doctrine Migrati...

    phpmatt 评论0 收藏0
  • php 学习指南及技术干货

    摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...

    lifefriend_007 评论0 收藏0
  • php 学习指南及技术干货

    摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...

    skinner 评论0 收藏0

发表评论

0条评论

ysl_unh

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<