Échec de la migration: la clause on est ambiguë

9

Je travaille avec le migratemodule pour la première fois et j'ai db_selectun peu travaillé avec l' API, mais je rencontre une erreur.

J'essaie de convertir d'anciennes étiquettes en une taxonomie drupale. Lorsque je navigue sur la /admin/content/migratepage, elle exécute correctement ma requête et affiche le bon nombre de lignes à migrer. Cependant, lorsque j'essaie d'exécuter l'importation, j'obtiens cette erreur:

Échec de la migration avec l'exception du plug-in source: SQLSTATE [23000]: violation de contrainte d'intégrité: 1052 La colonne 'labelId' dans la clause on est ambiguë

Voici le code que j'ai dans ma 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('');

Si je supprime les leftJoin()appels, il est évident que l'erreur sur l' oninstruction disparaît, mais je ne comprends pas en quoi cela labelIdest ambigu car je le référence toujours avec un alias de table.

Des idées d'où vient cette erreur? Provient-il du MigrateSQLMap en haut? Si oui, comment puis-je faire référence à cela labelIdavec un alias pour le rendre non ambigu? J'ai essayé de le faire l.labelId, mais cela n'a pas fonctionné.

Kenny Wyland
la source

Réponses:

30

Deviner!

Lors de la définition du champ dans MigrateSQLMap, je peux définir un alias de table pour le champ:

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

Le 'alias' => 'l'fait le labelIddevenir l.labelIddans les requêtes.

Kenny Wyland
la source
Merci. Eu le même problème. Vous devez marquer votre réponse comme correcte.
Perisdr
Même problème ... et la solution fonctionne parfaitement. J'ai passé beaucoup trop d'heures sur celui-ci! Merci d'avoir posté le correctif.
sea26.2
Vous méritez une médaille pour ce petit morceau.
doublejosh
1

Je pensais qu'il se couchait aliasà 1(c. -à- booléen vrai), mais il y a une raison pour laquelle il est une chaîne - qui est l'alias réel, donc si vous êtes alias est n, 'alias' => 'n'. Cela m'a coûté environ 1/2 heure.

Joshua Albert
la source