Direkt zum Inhalt
11. April 2017

Mehrdeutigkeit in der Drupal 8 Migrations-Quellabfrage verhindern

by Richard Papp

  

Wenn Sie die Datenbankabfrage in Drupal 8 Migrations-Quellplugins anpassen, kann es zu einem Fehler bei der Verletzung der Integritätsbeschränkung kommen. Dies kann durch das Setzen eines Alias für die Tabelle behoben werden.

Um nur Dateien zu migrieren, die an Nodes bestimmter Inhaltstypen angehängt sind, haben wir das Drupal 8 d6_file migration source plugin aus dem file-Modul erweitert und die Datenbankabfrage entsprechend angepasst:

namespace Drupal\custom_migration\Plugin\migrate\source;

/**
 * Drupal 6 Dateiquelle aus der Datenbank.
 *
 * @MigrateSource(
 * id = "d6_file_by_node_type",
 * source_module = "system"
 * )
 */
class File extends \Drupal\file\Plugin\migrate\source\d6\File {

  /**
   * {@inheritdoc}
   */
  public function query() {
    $query = parent::query();

    if (isset($this->configuration['node_type'])) {
      $query->innerJoin('upload', 'u', 'f.fid = u.fid');
      $query->innerJoin('node', 'n', 'u.nid = n.nid');
      $query->condition('n.type', (array) $this->configuration['node_type'], 'IN');
    }

    return $query;
  }

Die Ausführung dieser Migration schlug jedoch fehl, da die Datei-ID (fid) nun mehrdeutig war:

Integritätseinschränkungsverletzung: 1052 Column fid in on
Klausel ist mehrdeutig: SELECT f.*, map.sourceid1 AS
migrate_map_sourceid1, map.source_row_status AS
migrate_map_source_row_status
FROM
{files} f
INNER JOIN {upload} u ON f.fid = u.fid
INNER JOIN {Knoten} n ON u.nid = n.nid
LEFT OUTER JOIN drupal.migrate_map_d6_file map ON fid = map.sourceid1
WHERE (n.type IN (:db_condition_placeholder_0,
:db_condition_placeholder_1, :db_condition_placeholder_2,
:db_condition_placeholder_3)) AND ((map.sourceid1 IS NULL) OR
(map.source_row_status = :db_condition_placeholder_4))
ORDER BY timestamp ASC, f.fid ASC; Array
(
    [:db_condition_placeholder_0] => Seite
    [:db_condition_placeholder_1] => Artikel
    [:db_condition_placeholder_2] => press_release
    [:db_condition_placeholder_3] => Nachrichten
    [:db_condition_placeholder_4] => 1
)

Drupal 8 ändert die Abfrage stillschweigend, indem es eine Verknüpfung zu einer Zuordnungstabelle hinzufügt, um die Migrationsdaten für die Dateien zu suchen:

LEFT OUTER JOIN drupal.migrate_map_d6_file map ON fid = map.sourceid1

Da das d6_file source plugin keinen Tabellenalias für den Quellfeldbezeichner setzt, ist fid im oben genannten Join mehrdeutig. Die Spalte existiert sowohl in den Dateien als auch in den Upload-Datenbanktabellen. Um dies zu beheben, fügen Sie einfach einen Alias in MigrateSourceInterface::getIds() hinzu:

namespace Drupal\custom_migration\Plugin\migrate\source;

/**
 * Drupal 6 Dateiquelle aus der Datenbank.
 *
 * @MigrateSource(
 * id = "d6_file_by_node_type",
 * source_module = "system"
 * )
 */
class File extends \Drupal\file\Plugin\migrate\source\d6\File {

  /**
   * {@inheritdoc}
   */
  public function query() {
    $query = parent::query();

    if (isset($this->configuration['node_type'])) {
      $query->innerJoin('upload', 'u', 'f.fid = u.fid');
      $query->innerJoin('node', 'n', 'u.nid = n.nid');
      $query->condition('n.type', (array) $this->configuration['node_type'], 'IN');
    }

    return $query;
  }

  /**
   * {@inheritdoc}
   */
  public function getIds() {
    $ids = parent::getIds();

    $ids['fid']['alias'] = 'f';

    return $ids;
  }

}

 

Tools

Neuen Kommentar hinzufügen

Klartext

  • Keine HTML-Tags erlaubt.
  • Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • Website- und E-Mail-Adressen werden automatisch in Links umgewandelt.
CAPTCHA
Diese Sicherheitsfrage überprüft, ob Sie ein menschlicher Besucher sind und verhindert automatisches Spamming.