Migrationsfehler: Die on-Klausel ist nicht eindeutig

9

Ich arbeite migratezum ersten Mal mit dem Modul und habe db_selectein wenig mit der API gearbeitet, aber es tritt ein Fehler auf.

Ich versuche, einige alte Labels in eine Drupal-Taxonomie umzuwandeln. Wenn ich zur /admin/content/migrateSeite navigiere , wird meine Abfrage korrekt ausgeführt und die richtige Anzahl von Zeilen angezeigt, die migriert werden sollen. Wenn ich jedoch tatsächlich versuche, den Import auszuführen, wird folgende Fehlermeldung angezeigt:

Migration mit Ausnahme des Quell-Plugins fehlgeschlagen: SQLSTATE [23000]: Verletzung der Integritätsbeschränkung: 1052 Die Spalte 'labelId' in der on-Klausel ist nicht eindeutig

Hier ist der Code, den ich in meiner LabelMigration-Klasse habe:

$this->map = new MigrateSQLMap($this->machineName,

    array(
        'labelId' => array('type' => 'int', 'not null' => TRUE)
    ),
    MigrateDestinationTerm::getKeySchema()
);
$query = db_select('migrate_account_label', 'l')
         ->fields('l', array('labelId', 'label'))
;

$query->leftJoin('migrate_asset_labels_membership', 'lm', 'l.labelId = lm.labelId');
$query->leftJoin('migrate_asset', 'a', 'lm.assetId = a.assetId');
$query->addExpression('count(*)', 'num');
$query->condition('a.type', 'B');
$query->groupBy('l.labelId');
$query->groupBy('l.label');

$this->source = new MigrateSourceSQL($query);

// Set up our destination - terms in the vocabulary
$this->destination = new MigrateDestinationTerm('article_labels');

$this->addFieldMapping('name', 'label');
$this->addFieldMapping('description')
    ->defaultValue('');

Wenn ich die leftJoin()Aufrufe entferne, verschwindet offensichtlich der Fehler bezüglich der onAnweisung, aber ich verstehe nicht, wie labelIdmehrdeutig ist, da ich immer mit einem Tabellenalias darauf verweise.

Irgendwelche Ideen, woher dieser Fehler kommt? Kommt es von der MigrateSQLMap oben? Wenn ja, wie kann ich das labelIdmit einem Alias referenzieren, um es nicht mehrdeutig zu machen? Ich habe versucht, es zu schaffen l.labelId, aber das hat nicht funktioniert.

Kenny Wyland
quelle

Antworten:

30

Herausgefunden!

Beim Definieren des Feldes in der MigrateSQLMap kann ich einen Tabellenalias für das Feld festlegen:

$this->map = new MigrateSQLMap($this->machineName,
    array(
        'labelId' => array(
            'type' => 'int',
            'not null' => TRUE,
            'alias' => 'l', // it's the letter small case "L", not the digit 1
        )
    ),
    MigrateDestinationTerm::getKeySchema()
);

Das 'alias' => 'l'macht das labelIdWerden l.labelIdin den Abfragen.

Kenny Wyland
quelle
Vielen Dank. Hatte das gleiche Problem. Sie sollten Ihre Antwort als richtig markieren.
Perisdr
Gleiches Problem ... und Lösung funktioniert perfekt. Ich habe viel zu viele Stunden damit verbracht! Vielen Dank, dass Sie das Update veröffentlicht haben.
sea26.2
Sie verdienen eine Medaille für dieses bisschen.
DoubleJosh
1

Ich dachte, dass er aliasauf 1(dh boolean true) gesetzt hat, aber es gibt einen Grund, warum es eine Zeichenfolge ist - das ist der eigentliche Alias. Wenn Sie also ein Alias ​​sind n, ist , 'alias' => 'n'. Das hat mich ungefähr eine halbe Stunde gekostet.

Joshua Albert
quelle