摘要:自定義根據(jù)官方文檔,新建類(lèi),集成,并重寫(xiě),,,等方法。如果集成遷移組件的時(shí)候數(shù)據(jù)庫(kù)里已經(jīng)存在表且有類(lèi)型的字段,那么執(zhí)行遷移命令時(shí)就會(huì)報(bào)錯(cuò)。下一章我們來(lái)詳細(xì)研究如何集成方式的數(shù)據(jù)遷移組件。
自定義type
根據(jù)官方文檔,新建TinyIntType類(lèi),集成Type,并重寫(xiě)getName,getSqlDeclaration,convertToPHPValue,getBindingType等方法。
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語(yǔ)句,需要根據(jù)傳入的參數(shù)處理sql拼接。
注冊(cè)自定義類(lèi)型Type::addType(TinyIntType::TYPENAME, "db ypesTinyIntType"); $connection->getDatabasePlatform()->registerDoctrineTypeMapping(TinyIntType::TYPENAME, TinyIntType::TYPENAME);
這樣,你在編寫(xiě)遷移類(lèi)代碼的時(shí)候就可以使用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類(lèi)型沖突
遷移組件不支持enum類(lèi)型,也無(wú)法自定義該類(lèi)型。如果集成遷移組件的時(shí)候數(shù)據(jù)庫(kù)里已經(jīng)存在表且有enum類(lèi)型的字段,那么執(zhí)行遷移命令時(shí)就會(huì)報(bào)錯(cuò)。
為了解決這個(gè)問(wèn)題,我們需要把enum映射為string類(lèi)型即可:
$connection->getDatabasePlatform()->registerDoctrineTypeMapping("enum", "string");結(jié)語(yǔ)
至此,我們已經(jīng)完成了遷移組件的所有遷移工作,并且已經(jīng)能很好的在項(xiàng)目中使用它。
目前集成的是版本管理的方式,是遷移組件默認(rèn)支持的,也是laravel框架集成的遷移方式。還有之前說(shuō)到的另一種diff方式的遷移,diff方式能夠更精準(zhǔn)的控制表結(jié)構(gòu)。
下一章我們來(lái)詳細(xì)研究如何集成diff方式的數(shù)據(jù)遷移組件。
在我的代碼庫(kù)可以查看這篇文章的詳細(xì)代碼,歡迎star。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/28796.html
摘要:結(jié)語(yǔ)到此,數(shù)據(jù)遷移組件就已經(jīng)很靈活的集成到我們自己的項(xiàng)目中了,而且你還可以根據(jù)自己的項(xiàng)目靈活修改自定義命令腳本文件。但是如果使用久了會(huì)發(fā)現(xiàn)現(xiàn)在的數(shù)據(jù)遷移會(huì)有兩個(gè)問(wèn)題不支持類(lèi)型,在相關(guān)中,官方開(kāi)發(fā)人員有回復(fù)所以只能添加自定義類(lèi)型。 自定義命令腳本 目錄結(jié)構(gòu) 目前的項(xiàng)目結(jié)構(gòu)是這樣的(參照代碼庫(kù)): showImg(https://segmentfault.com/img/remote/14...
摘要:是基于組件的數(shù)據(jù)遷移組件。版本管理把數(shù)據(jù)庫(kù)變更寫(xiě)入到代碼中,來(lái)進(jìn)行版本管理。此系列文章不討論現(xiàn)有框架中數(shù)據(jù)遷移組件的使用,而是著重于探討如何單獨(dú)使用遷移組件以及如何把數(shù)據(jù)遷移組件集成到自己的項(xiàng)目個(gè)性化定制。 場(chǎng)景分析 團(tuán)隊(duì)開(kāi)發(fā)中,每個(gè)開(kāi)發(fā)人員對(duì)于數(shù)據(jù)庫(kù)都修改都必須手動(dòng)記錄,上線時(shí)需要人工整理,運(yùn)維成本極高。而且在多個(gè)開(kāi)發(fā)者之間數(shù)據(jù)結(jié)構(gòu)同步也是很大的問(wèn)題。Doctrine Migrati...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù)一個(gè)兼容標(biāo)準(zhǔn)的過(guò)濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫(kù)使用生成隨機(jī)數(shù)的庫(kù)一個(gè)安全庫(kù)一個(gè)純安全通信庫(kù)一個(gè)簡(jiǎn)單的鍵值加密存儲(chǔ)庫(kù)一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫(kù)一個(gè)掃描文件安全的庫(kù) Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù) HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過(guò)濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù)一個(gè)兼容標(biāo)準(zhǔn)的過(guò)濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫(kù)使用生成隨機(jī)數(shù)的庫(kù)一個(gè)安全庫(kù)一個(gè)純安全通信庫(kù)一個(gè)簡(jiǎn)單的鍵值加密存儲(chǔ)庫(kù)一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫(kù)一個(gè)掃描文件安全的庫(kù) Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù) HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過(guò)濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
閱讀 1876·2019-08-30 15:53
閱讀 3199·2019-08-30 15:44
閱讀 2811·2019-08-26 13:31
閱讀 1954·2019-08-26 12:10
閱讀 801·2019-08-26 11:01
閱讀 2132·2019-08-23 15:32
閱讀 1588·2019-08-23 13:43
閱讀 2538·2019-08-23 11:58