Drupal → Миграция терминов и комментариев с сохранением идентификаторов

10.01.2012

Небольшой костыль, который позволяет импортировать термины и комментарии с сохранением оригинального идентификатора:

// Термины
class TermMigration extends Migration {
  public function __construct($arguments) {
    ...
    $this->addFieldMapping('tid', 'some_primary_key');
  }

  public function prepare($term, $row) {
    db_query("INSERT IGNORE INTO {taxonomy_term_data} (tid) VALUES (?)", array($term->tid));
  }
}

// Комментарии
class CommentMigration extends Migration {
  public function __construct($arguments) {
    ...
    $this->addFieldMapping('cid', 'some_primary_key');
  }

  public function prepare($comment, $row) {
    db_query("INSERT IGNORE INTO {comment} (cid) VALUES (?)", array($comment->cid));
  }
}
Написанное актуально для
Migrate 2.5
Похожие записи

Комментарии

Магический костыль. Действительно помог. Спасибо!

Mneznakomec
01.11.2013, 08:02

Костыль помогает, только вот откатить изменения потом невозможно: из таблиц статистики, данных и ревизий body комментариев данные не удаляются. То есть нужно как-то дописывать процедуру отката, где чистить данные практически вручную, или ещё что делать.

Всё же более правильным вариантом остаётся migrate-way-путь, при котором ID коммента создаётся генератором таблицы, а все соответствия задаются указанием исходной миграции. То есть загрузку комментов осуществляем как обычно, cid не задаём. А вот когда задаём присвоение и прочее, то ставим sourceMigration.

У меня основной проблемой было задать в данных коммента поле parent (cid вручную не стал задавать). Воспользовался такой строкой:

    $this->addFieldMapping('pid', 'parentID')->sourceMigration('ReportComment');

То есть когда я задаю родителя, я использую ту же миграцию, которая идёт в данный момент и выбираю данные, которые уже есть в карте соответствий (мэппинге).

много раз пользовался способом из темы, проблем замечено не было

Mneznakomec
01.11.2013, 08:15

Использую 7.x-2.6-rc1+13-dev

В логе миграции написано, что данные не создаются, а обновляются. Соответственно, удаления их при откате не происходит.

xandeadx, вот один из логов: 0 created, 68 updated, 0 failed. field_data_comment_body и field_revision_comment_body не очистились, насчёт comment сказать не могу, много поменял.

Ещё у меня странная проблема: комменты откатываются, но штук 5 из 200 примерно удаляться сами не хотят физически из таблиц комментариев. Если загрузить станицу с данными комментами, вылетает ошибка "потери связи с сущностью", в списке содержания (комменты) чисто.

Это, конечно, мелочи, потому что данные я импортирую и откатывать не буду, но вот столкнулся.

С нодами и юзерами проблем нет.

P.S.: модуль всё равно шикарный, спасибо, xandeadx!

Mneznakomec
01.11.2013, 15:13

Ещё у меня странная проблема: комменты откатываются, но штук 5 из 200 примерно удаляться сами не хотят физически из таблиц комментариев.

Всё же нашёл ошибку: при задании uid (автор коммента), задавал напрямую значения id, но самого пользователя с таким id не импортировал (забанен). Поэтому при выборке была проблема (у migrate тоже).

Решил таким образом:

$this->addFieldMapping('uid', 'userID')->sourceMigration('SiteUsers')->defaultValue(0);

Добавить комментарий