因此,我在寫一個laravel多態關係的遷移時遇到了這個問題,Franck的答案很接近,但是錯過了更新本地鍵以匹配新行的部分。
我下面弗蘭克的回答原來的移民是
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`)
SELECT `title`, `content`
FROM `blocks` where `type` = "anchor";
如果參照原始塊住在anchor_block作爲屬於這個本來是很容易的,我可能只是做
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `block_id`)
SELECT `title`, `content`, `id`
FROM `blocks` where `type` = "anchor";
但是這種情況並非如此,因爲多態關係存在於blocks表中,所以我最終得到了以下代碼:
/* Create The New Table */
CREATE TABLE `block_anchor_blocks` (
`id` CHAR(36) PRIMARY KEY,
`anchor_slug` VARCHAR(255),
`label` VARCHAR(255),
`created_at` TIMESTAMP,
`updated_at` TIMESTAMP
);
/* Build the polymorphic fields on the table we're refactoring */
ALTER TABLE `blocks`
ADD `blockable_id` CHAR(36);
ALTER TABLE `blocks`
ADD `blockable_type` VARCHAR(255);
/* Generate the UUID to use when creating an entry in the new table. */
UPDATE `blocks`
SET `blockable_id`=(SELECT UUID()),`blockable_type`="Acme\\Shared\\Entities\\Blocks\\AnchorBlock"
WHERE `type` = "anchor";
/* Finally we Insert using the ID we generated in the last step */
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `id`, `created_at`, `updated_at`)
SELECT `title`, `content`, `blockable_id`, NOW(), NOW()
FROM `blocks` where `type` = "anchor";
有希望的是,這有助於任何嘗試將大型單個表重構爲多個連接表的人。
好吧從table1中獲取想法,但是從哪裏獲取ticketing_information的其餘數據? –
儘管最初的語法可能有點令人困惑,但MySQL的SQL與您在其他數據庫中使用的SQL類型非常相似,所以這是一項投資,將來會帶來收益。一般來說,你對SQL有很好的參考嗎? – tadman
ticketing_information的數據現在只是默認值。不,我不知道任何sql –