通常我为这些任务创建一个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
在您的情况下,获取所有 DataObjects、遍历它们并对它们执行强制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
,以便任务不再可用。