通常我爲這些任務創建一個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
,使任務不再可用。