Falha na migração: na cláusula ambígua

9

Estou trabalhando com o migratemódulo pela primeira vez e trabalhei com a db_selectAPI um pouco, mas estou com um erro.

Estou tentando converter alguns rótulos antigos em uma taxonomia drupal. Quando navego para a /admin/content/migratepágina, ele faz minha consulta corretamente e mostra o número certo de linhas que devem ser migradas. No entanto, quando realmente tento executar a importação, recebo este erro:

Falha na migração com a exceção do plug-in de origem: SQLSTATE [23000]: Violação de restrição de integridade: 1052 A coluna 'labelId' na cláusula on é ambígua

Aqui está o código que tenho na minha 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 eu remover as leftJoin()chamadas, obviamente o erro sobre a oninstrução desaparecerá, mas não entendo como labelIdé ambíguo, porque estou sempre referenciando-a com um alias de tabela.

Alguma idéia de onde esse erro vem? É proveniente do MigrateSQLMap na parte superior? Se sim, como posso referenciar isso labelIdcom um alias para torná-lo não ambíguo? Eu tentei fazer isso l.labelId, mas isso não funcionou.

Kenny Wyland
fonte

Respostas:

30

Descobri isso!

Ao definir o campo no MigrateSQLMap, posso definir um alias de tabela para o 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()
);

O 'alias' => 'l'torna o labelIdtornar - se l.labelIdnas consultas.

Kenny Wyland
fonte
Obrigado. Teve o mesmo problema. Você deve marcar sua resposta como correta.
Perisdr
O mesmo problema ... e a solução funciona perfeitamente. Passei muitas horas nessa! Obrigado por postar a correção.
precisa saber é o seguinte
Você merece uma medalha por esse pouco.
Doublejosh
1

Eu pensei que ele estava definindo aliascomo 1(ou seja, boolean true), mas há uma razão para ser uma string - esse é o alias real, então se você é o alias n, é 'alias' => 'n'. Isso realmente me custou cerca de meia hora.

Joshua Albert
fonte