Migrazione non riuscita: la clausola on è ambigua


9

Sto lavorando con il migratemodulo per la prima volta e ho lavorato db_selectun po ' con l' API, ma sto riscontrando un errore.

Sto cercando di convertire alcune vecchie etichette in una tassonomia drupal. Quando accedo alla /admin/content/migratepagina, esegue correttamente la mia query e mostra il numero corretto di righe da migrare. Tuttavia, quando provo effettivamente a eseguire l'importazione, ottengo questo errore:

Migrazione non riuscita con eccezione del plug-in di origine: SQLSTATE [23000]: Violazione del vincolo di integrità: 1052 La colonna "labelId" nella clausola on è ambigua

Ecco il codice che ho nella mia classe LabelMigration:

$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('');

Se rimuovo le leftJoin()chiamate, ovviamente l'errore ondell'istruzione scompare, ma non capisco quanto labelIdsia ambiguo perché lo faccio sempre riferimento con un alias di tabella.

Qualche idea da dove provenga questo errore? Viene dalla MigrateSQLMap in alto? In tal caso, come posso fare riferimento a questo labelIdcon un alias per renderlo non ambiguo? Ho provato a farlo l.labelId, ma non ha funzionato.

Risposte:


30

Capito!

Quando si definisce il campo in MigrateSQLMap, posso impostare un alias di tabella per il campo:

$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()
);

Il 'alias' => 'l'rende il labelIddiventare l.labelIdnelle query.


Grazie. Ho avuto lo stesso problema. È necessario contrassegnare la risposta come corretta.
Perisdr,

Stesso problema ... e la soluzione funziona perfettamente. Ho passato troppe ore su questo! Grazie per aver pubblicato la correzione.
26.2

Ti meriti una medaglia per quel po 'di marea.
doublejosh,

1

Ho pensato che stava tramontando aliasal 1(vale a dire, booleano vero), ma c'è un motivo che è una stringa - che è l'alias reale, quindi se siete alias è n, 'alias' => 'n'. Questo in realtà mi è costato circa 1/2 ora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.