Рейтинг:0

Сопоставление profile_id на основе ранее сопоставленного uid при переносе профилей пользователей из CSV-файла

флаг us

Я пытаюсь перенести пользователей и профили пользователей на сайт, где оба объекта уже могут присутствовать. В этом случае я хотел бы перезаписать указанные поля и оставить другие в исходном состоянии. я пытаюсь составить карту profile_id как это:

  ИД:
    плагин: migration_lookup
    no_stub: правда
    # предыдущая миграция пользователя
    миграция: mayors_users
    # свойство в исходных данных
    источник: лау
  id_профиля:
    плагин: entity_lookup
    entity_type: профиль
    комплектация: профиль
    bundle_key: тип
    ключ_значения: идентификатор пользователя
    источник: '@uid'

Однако это не удается, поэтому profile_id является ноль.

Вы случайно не знаете, как я могу использовать для этого плагин entity_lookup (или другой)?

РЕДАКТИРОВАТЬ: Похоже, это может быть проблема с ядром Drupal. Я отлаживал код EntityLookup.php плагин и напечатал фактический запрос БД, сгенерированный из запроса объекта:

ВЫБЕРИТЕ base_table.revision_id КАК ревизия_id, base_table.profile_id КАК profile_id
ИЗ профиля base_table
         INNER JOIN профиль профиля ON profile.profile_id = base_table.profile_id
ГДЕ (profile.uid = '153')
  И (profile.type = 'профиль')

Это отлично работает и возвращает следующий результат при использовании непосредственно на сервере MySQL:

id_revision_id profile_id
87 87

Однако, $запрос->выполнить() по-прежнему возвращает пустой массив. Почему?

РЕДАКТИРОВАТЬ: Похоже, это может быть ошибка: https://www.drupal.org/project/migrate_plus/issues/3230477

Рейтинг:1
флаг bd

Если я правильно понимаю ваш вопрос и это действительно ошибка (так что нет правильного решения вашей проблемы), я могу придумать как минимум два способа обойти это.

1. hook_migrate_prepare_row / hook_migrate_MIGRATION_ID_prepare_row

Вы могли бы использовать hook_migrate_prepare_row или же hook_migrate_MIGRATION_ID_prepare_row для предварительной обработки ваших исходных данных и получения uid и идентификатора профиля вручную, примерно так:

/**
 * Реализует hook_migrate_MIGRATE_ID_prepare_row().
 */
function my_module_migrate_MIGRATE_ID_prepare_row (строка $ row, MigrateSourceInterface $ source, MigrationInterface $ migrate) {
  $raw_data = (объект) $row->getSource()['raw'];
  // Здесь база данных запрашивает по мере необходимости.
  // $uid = \Drupal::database()->выбрать ...
  // $profile_id = \Drupal::database()->выбрать ...
  $row->setSourceProperty('uid', $uid);
  $row->setSourceProperty('profile_id', $profile_id);
}

Обратите внимание, что Миграция плюс предоставляет объектно-ориентированную альтернативу этим хукам: https://www.drupal.org/docs/upgrading-drupal/customize-migrations-when-upgrading-to-drupal-8-or-later#s-migrate-plus-provides-a-prepare-row-event

2. Напишите свой собственный плагин процесса

На drupal.org есть хорошая документация о том, как написать плагин процесса: https://www.drupal.org/docs/8/api/migrate-api/migrate-process/writing-a-process-plugin

В основном это выглядит так:

<?php

пространство имен Drupal\my_module\Plugin\migrate\process;

используйте Drupal\migrate\ProcessPluginBase;
используйте Drupal\migrate\MigrateExecutableInterface;
используйте Drupal\migrate\Row;

/**
 * Предоставляет подключаемый модуль процесса миграции «ExtractProfileIdFromLau».
 *
 * @MigrateProcessPlugin(
 * id = "extract_profile_id_from_lau"
 * )
 */
класс ExtractProfileIdFromLau расширяет ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  общедоступная функция преобразования ($ значение, MigrateExecutableInterface $ migrate_executable, строка $ строка, $ destination_property) {
    // Получить идентификатор профиля.
    $profile_id = \Drupal::database()->выберите ...
    вернуть $profile_id;
  }

}

И на него можно ссылаться в файле migration.yml в разделе процесс раздел, что-то вроде этого, например:

процесс:
  id_профиля:
    -
      плагин: extract_profile_id_from_lau
      источник: лау

Не совсем уверен, какой способ подойдет вам лучше всего, но это две идеи, которые приходят на ум. По крайней мере, я бы так попробовал.

флаг us
Спасибо, я попробую их.
Рейтинг:0
флаг us

В конце концов, решение заключалось в создании моего собственного плагина процесса миграции, ключевой частью которого является:

$statement = \Drupal::database()
  ->выбрать('профиль', 'р')
  ->поля('p', ['profile_id'])
  ->условие('p.uid', $значение, '0')
  ->выполнить();
$result = $statement->fetchAllAssoc('profile_id');
вернуть array_keys($result)[0];

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.