Error de migración: en la cláusula es ambigua

9

Estoy trabajando con el migratemódulo por primera vez y he trabajado db_selectun poco con la API, pero me encuentro con un error.

Estoy tratando de convertir algunas etiquetas antiguas en una taxonomía drupal. Cuando navego a la /admin/content/migratepágina, realiza mi consulta correctamente y muestra el número correcto de filas que deben migrarse. Sin embargo, cuando realmente intento ejecutar la importación, aparece este error:

La migración falló con la excepción del complemento de origen: SQLSTATE [23000]: Infracción de restricción de integridad: 1052 La columna 'labelId' en la cláusula on es ambigua

Aquí está el código que tengo en mi clase 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 elimino las leftJoin()llamadas, entonces obviamente el error sobre la ondeclaración desaparece, pero no entiendo cómo labelIdes ambiguo porque siempre estoy haciendo referencia a él con un alias de tabla.

¿Alguna idea de dónde viene este error? ¿Viene del MigrateSQLMap en la parte superior? Si es así, ¿cómo puedo hacer referencia a eso labelIdcon un alias para que no sea ambiguo? Traté de hacerlo l.labelId, pero eso no funcionó.

Kenny Wyland
fuente

Respuestas:

30

¡Lo averigué!

Al definir el campo en MigrateSQLMap, puedo establecer un alias de tabla para el 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()
);

El 'alias' => 'l'hace el labelIdconvertido l.labelIden las consultas.

Kenny Wyland
fuente
Gracias. Tuve el mismo problema Debes marcar tu respuesta como correcta.
Perisdr
Mismo problema ... y la solución funciona perfectamente. ¡He pasado demasiadas horas en este! Gracias por publicar la solución.
sea26.2
Te mereces una medalla por ese tid bit.
doublejosh
1

Pensé que se estaba poniendo aliasa 1(es decir, la verdadera booleano), pero hay una razón que es una cadena - que es el alias actual, así que si estás alias es n, 'alias' => 'n'. Eso realmente me costó aproximadamente 1/2 hora.

Joshua Albert
fuente