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

最新文章

  1. 从Google工程师到创业CTO,他的8项理念也许可以帮到你
  2. 4、JavaScript
  3. JSPatch 实现原理详解
  4. 高宽不定的div相对父div上下、左右居中
  5. UWP开发-HTTP详解
  6. jpg图片转eps 用于LaTeX
  7. 1.表单中 get与post提交方法的区别?
  8. Java中如何在另一个类里面使用运行类中的对象,举例说明了一下。
  9. 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)
  10. Oracle SQL Lesson (6) - 使用Join进行联合查询
  11. Java集合类源码解析:Vector
  12. JVM学习笔记:对象的创建
  13. 低电平ViL
  14. BZOJ2287 【POJ Challenge】消失之物 动态规划 分治
  15. strlen函数细节
  16. spring mvc ajax异步文件的上传和普通文件上传
  17. 在Android Studio中打开Android Device Monitor时报错的解决方法
  18. 怎么输入MathType不等号
  19. centos 6 YUM安装 lnmp
  20. 算法------------数组----------------两个数组的交集 II

热门文章

  1. 云计算之概念——IaaS、SaaS、PaaS、Daas
  2. sql语句浅谈以及mysql遇到的问题解决见解
  3. Java日志系统
  4. hdu-2619 Love you Ten thousand years
  5. Android(java)学习笔记208:Android下的属性动画高级用法(Property Animation)
  6. miniui dataGrid drawcell事件
  7. 【[USACO12FEB]附近的牛Nearby Cows】
  8. 视频(video)属性
  9. STM32F103 ucLinux开发之一(BOOT分析及源码)
  10. 第28章 LTDC—液晶显示中英文