Błąd migracji: klauzula jest niejednoznaczna

9

Pracuję z migratemodułem po raz pierwszy i db_selecttrochę pracowałem z interfejsem API, ale mam błąd.

Próbuję przekształcić niektóre stare etykiety w taksonomię drupala. Gdy przeglądam /admin/content/migratestronę, wykonuje moje zapytanie poprawnie i pokazuje odpowiednią liczbę wierszy, które powinny zostać zmigrowane. Jednak gdy próbuję uruchomić import, pojawia się ten błąd:

Migracja nie powiodła się z wyjątkiem wtyczki źródłowej: SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1052 Kolumna „labelId” w klauzuli jest niejednoznaczna

Oto kod, który mam w mojej klasie 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('');

Jeśli usunę leftJoin()wywołania, to oczywiście błąd dotyczący oninstrukcji zniknie, ale nie rozumiem, jak labelIdto jest niejednoznaczne, ponieważ zawsze odwołuję się do niej za pomocą aliasu tabeli.

Wszelkie pomysły, skąd pochodzi ten błąd? Czy pochodzi z MigrateSQLMap u góry? Jeśli tak, to jak mogę odwoływać labelIdsię do niego za pomocą aliasu, aby był niejednoznaczny? Próbowałem to zrobić l.labelId, ale to nie działało.

Kenny Wyland
źródło

Odpowiedzi:

30

Domyśliłam się!

Podczas definiowania pola w MigrateSQLMap mogę ustawić alias tabeli dla tego pola:

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

W 'alias' => 'l'sprawia, że labelIdstają się l.labelIdw zapytaniami.

Kenny Wyland
źródło
Dzięki. Miałem ten sam problem. Powinieneś zaznaczyć swoją odpowiedź jako poprawną.
Perisdr,
Ten sam problem ... i rozwiązanie działa idealnie. Spędziłem na tym zbyt wiele godzin! Dziękujemy za opublikowanie poprawki.
morze26,2
Zasługujesz na medal za ten kawałek.
doublejosh
1

Myślałem, że zachodziło aliasdo 1(tj logiczna prawda), ale nie ma powodu, że jest to ciąg - czyli rzeczywisty alias, więc jeśli jesteś alias jest n, 'alias' => 'n'. To faktycznie kosztowało mnie około 1/2 godziny.

Joshua Albert
źródło