自定义类型根据官方文档,新建TinyIntType类,集成Type,重写getName、getSqlDeclaration、convertToPHPValue、getBindingType等方法。TinyIntType.php完整代码:*/classTinyIntTypeextendsType{publicfunctiongetName(){返回'??tinyint';}publicfunctiongetSQLDeclaration(array$fieldDeclaration,AbstractPlatform$platform){$sql='TINYINT';如果(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';}返回$sql;}公共函数convertToPHPValue($value,AbstractPlatform$platform){return(null===$value)?空:(整数)$值;}publicfunctiongetBindingType(){returnParameterType::INTEGER;}}其中getSqlDeclaration方法用于生成sql语句,需要根据传入参数进行sql拼接,注册自定义类型Type::addType(TinyIntType::TYPENAME,'db\types\TinyIntType');$connection->getDatabasePlatform()->registerDoctrineTypeMapping(TinyIntType::TYPENAME,TinyIntType::TYPENAME);这样写迁移代码的时候就可以使用tinyint了,例如:publicfunctionup(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映射到string类型:$connection->getDatabasePlatform()->registerDoctrineTypeMapping('enum','string');结束语至此,我们已经完成了迁移组件的所有迁移工作,并且已经可以很好的在项目中使用了。目前集成的是版本管理方式,迁移组件默认支持,也是laravel框架集成的迁移方式。还有前面提到的另一种diff方法的迁移。diff方法可以更准确地控制表结构。在下一章中,我们将详细研究如何以diff方式集成数据迁移组件。可以在我的代码库中查看本文的详细代码,欢迎star。
