2013-10-01 55 views
2

如果我有兩個現有的DataObjects行爲共享公用數據&行爲,例如他們都有一個Title字段在$ db變量&我想將共享數據移動到基類兩個DataObjects,如果我已經在數據庫中有與DataObject關聯的數據,我該如何將這些數據與結構一起遷移,而不必陷入sql困擾?還是沒有其他辦法可以做到這一點?在SilverStripe中重建數據庫時遷移數據

所以說,我的兩個DataObjectsBaseDataObject例如繼承得到他們Title數據,該數據在數據庫移動到一個表叫BaseDataObject只有現有Title數據不會遷移,很明顯,我怎麼去有關遷移呢?

編輯:

我接受了下面,即使它不是解決我的問題的答案。

我想說的接受的答案是更相關的遷移數據,但是,解決我想在多個DataObjects共享領域的問題的問題,而是在一個地方宣佈保持當前的數據庫結構同樣,我通過DataExtension課程擴展課程,並以這種方式應用它們。

回答

1

通常我爲這些任務創建一個BuildTask。有時候,你必須做更復雜的遷移,而不是單獨使用SQL(儘管在你的特定情況下,SQL可以很好),而且比編寫自定義PHP腳本更容易,因爲你可以利用SilverStripe框架的強大功能。這裏的基本結構:

class MigrateTask extends BuildTask 
{ 
    protected $title = 'Task title'; 
    protected $description = 'Task description'; 
    protected $enabled = true; 

    public function run($request) { 
     // perform your migrations here 
    } 
} 

這個任務,然後會顯示出來,當你進入http://yoursite.com/dev/tasks

你的情況可能是足以讓所有的數據對象,遍歷它們並對其進行強制write(例如$dataObect->write(false, false, true);)。檢查是否將標題從子類寫入基類。如果是這種情況,可以從子類表中安全地刪除Title字段。否則,你將不得不執行一些稍微低級的過程。也許東西沿着這些線路:

$rslt = DB::query('SELECT * FROM "DataObjectSubclass"'); 
foreach($rslt as $r){ 
    DB::query('UPDATE "DataObjectBaseClass" SET "Title" = \''. $r['Title'] .'\' WHERE ID = '. $r['ID']); 
} 

// you could even drop the title field once you're done.. 
// But you'll have to be sure that the above code migrated your data 
// correctly. Otherwise you're screwed ;) 
DB::query('ALTER TABLE "DataObjectSubclass" DROP "Title"'); 

一旦遷移完成後,可以將$enabled變量設置爲false,使任務不再可用。