Puncte:0

Hartați profile_id pe baza uid-ului mapat anterior la migrarea profilurilor de utilizator din fișierul CSV

drapel us

Încerc să migrez utilizatorii și profilurile de utilizatori pe site, unde ambele entități ar putea fi deja prezente. În acest caz, aș dori să suprascriu câmpurile specificate și să le las pe altele în starea inițială. Încerc să fac o hartă profile_id ca aceasta:

  uid:
    plugin: migration_lookup
    no_stub: adevărat
    # migrare anterioară de utilizator
    migrație: primari_utilizatori
    # proprietate în datele sursă
    sursa: lau
  profile_id:
    plugin: entity_lookup
    entity_type: profile
    pachet: profil
    bundle_key: tip
    value_key: uid
    sursa: „@uid”

Cu toate acestea, acest lucru eșuează, deci profile_id este nul.

Se întâmplă să știi cum pot folosi plugin-ul entity_lookup (sau alt) pentru asta?

EDIT: Se pare că aceasta ar putea fi o problemă de bază Drupal. Am depanat codul de EntityLookup.php plugin și a tipărit interogarea DB reală generată din interogarea entitate:

SELECT bazează_table.revision_id AS revision_id, base_table.profile_id AS profile_id
FROM profile base_table
         INNER JOIN profile profile ON profile.profile_id = base_table.profile_id
WHERE (profile.uid = '153')
  ȘI (profile.type = „profil”)

Acest lucru funcționează bine și returnează următorul rezultat atunci când este utilizat direct împotriva serverului MySQL:

revision_id profile_id
87 87

In orice caz, $query->execute() returnează totuși o matrice goală. De ce?

EDIT: Se pare că aceasta ar putea fi o eroare: https://www.drupal.org/project/migrate_plus/issues/3230477

Puncte:1
drapel bd

Dacă vă înțeleg corect întrebarea și este într-adevăr o eroare (astfel încât să nu existe o soluție adecvată pentru problema dvs.), mă pot gândi la cel puțin 2 moduri în care puteți rezolva acest lucru.

1. hook_migrate_prepare_row / hook_migrate_MIGRATION_ID_prepare_row

Ai putea folosi hook_migrate_prepare_row sau hook_migrate_MIGRATION_ID_prepare_row pentru a preprocesa datele sursă și a prelua manual uid-ul și ID-ul profilului, ceva de genul acesta:

/**
 * Implementează hook_migrate_MIGRATE_ID_prepare_row().
 */
funcția my_module_migrate_MIGRATE_ID_prepare_row(Rând $rând, MigrateSourceInterface $sursă, MigrationInterface $migrare) {
  $raw_data = (obiect) $row->getSource()['raw'];
  // Aici interogările bazei de date sunt necesare.
  // $uid = \Drupal::database()->select...
  // $profile_id = \Drupal::database()->selectați...
  $row->setSourceProperty('uid', $uid);
  $row->setSourceProperty('profile_id', $profile_id);
}

Rețineți că Migrare Plus oferă o alternativă orientată pe obiecte la aceste cârlige: 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. Scrieți propriul plugin de proces

Există o documentație bună despre cum să scrieți un plugin de proces pe drupal.org: https://www.drupal.org/docs/8/api/migrate-api/migrate-process/writing-a-process-plugin

Practic arată așa:

<?php

spațiu de nume Drupal\modulul_meu\Plugin\migrate\process;

utilizați Drupal\migrate\ProcessPluginBase;
utilizați Drupal\migrate\MigrateExecutableInterface;
utilizați Drupal\migrate\Row;

/**
 * Oferă un plugin pentru procesul de migrare „ExtractProfileIdFromLau”.
 *
 * @MigrateProcessPlugin(
 * id = "extract_profile_id_from_lau"
 * )
 */
clasa ExtractProfileIdFromLau extinde ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  Transformare funcție publică ($valoare, MigrateExecutableInterface $migrate_executable, Rând $rând, $proprietate_destinație) {
    // Preluați id-ul profilului.
    $profile_id = \Drupal::database()->selectați...
    returnează $profile_id;
  }

}

Și poate fi referit în fișierul migration.yml sub proces secțiune, ceva de genul acesta, de exemplu:

proces:
  profile_id:
    -
      plugin: extract_profile_id_from_lau
      sursa: lau

Nu sunt sigur în ce mod ar funcționa cel mai bine pentru dvs., dar acestea sunt cele 2 idei care v-ar veni în minte. Cel putin asa as incerca eu.

drapel us
Multumesc, o sa le incerc.
Puncte:0
drapel us

În cele din urmă, soluția a fost crearea propriului plugin de proces de migrare, a cărui parte cheie este:

$statement = \Drupal::database()
  ->select('profil', 'p')
  ->fields('p', ['profile_id'])
  ->condition('p.uid', $value, '0')
  ->execute();
$rezultat = $statement->fetchAllAssoc('profile_id');
returnează chei_matrice($rezultat)[0];

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.