2

如果我有两个现有DataObjects的共享公共数据和行为,例如它们Title在 $db 变量中都有一个字段并且我想将共享数据移动到两者的基类中DataObjects,如果我已经在关联的数据库中有数据我DataObject如何迁移这些数据以及结构,而不必陷入 sql 中?还是没有其他方法可以做到这一点?

所以说我的两个通过继承来DataObjects获取他们的数据,例如,数据库中的这些数据移动到一个名为仅现有数据不会迁移的表中,显然,我该如何迁移它?TitleBaseDataObjectBaseDataObjectTitle

编辑:

我接受了下面的答案,即使它不是我问题的解决方案。

我想说接受的答案与迁移数据的问题更相关,但是,为了解决我想要一个跨多个共享字段DataObjects但在一个地方声明同时保持当前数据库结构相同的问题,我继续扩展通过类进行DataExtension类并以这种方式应用它们。

4

1 回答 1

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

在您的情况下,获取所有 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,以便任务不再可用。

于 2013-10-01T12:41:39.183 回答