xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

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

// Термины
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
Похожие записи

Комментарии RSS

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

Спасибо! Пригодилось.

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

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

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

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

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

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

Использую 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!

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

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании