2013-10-01 1 views
2

Если у меня есть два существующие DataObjects, которые разделяют общие данные & поведения, скажем, например, они оба имеют Title поля в переменном $ дб & Я хочу, чтобы переместить общие данные в базовый класс для два DataObjects, если у меня уже есть данные в базе данных, связанные с DataObject, как мне перенести эти данные вместе со структурой, не забиваясь в sql? или нет другого способа сделать это?Перенос данных при реструктуризации базы данных в SilverStripe

Так говорят мои два DataObjects получить свои данные Title унаследовав от BaseDataObject, например, эти данные в БД перемещается в таблицу под названием BaseDataObject только существующие Title данные обыкновение мигрировать, очевидно, как я идти о переносе его?

Edit:

Я принял ответ ниже, даже если это не было решением моей проблемы.

Я бы сказал, что принял ответ более непосредственное отношение к вопросу о миграции данных, однако, решить мою проблему желая поле разделен между несколькими 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

В вашем случае это может быть достаточно, чтобы получить все DataObjects, перебирать их и выполнить вынужденную write на них (например, $dataObect->write(false, false, true);). Проверьте, действительно ли это записало Title over из подкласса в базовый класс. Если это так, вы можете безопасно удалить поле 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, так что задача больше недоступна.

Смежные вопросы