Невдача міграції: застереження неоднозначне


9

Я працюю з migrateмодулем вперше, і я db_selectтрохи працював з api, але я стикаюся з помилкою.

Я намагаюся перетворити деякі старі етикетки в друпальську систематику. Коли я переглядаю /admin/content/migrateсторінку, він робить свій запит правильно і показує потрібну кількість рядків, які слід перенести. Однак, коли я намагаюся запустити імпорт, я отримую цю помилку:

Помилка міграції за винятком додатка джерела: SQLSTATE [23000]: Порушення обмеження цілісності: 1052 У колонці "labelId" у пункті неоднозначно

Ось код, який я маю в своєму класі 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('');

Якщо я видаляю leftJoin()виклики, тоді, очевидно, помилка щодо onтвердження відпадає, але я не розумію, наскільки labelIdце неоднозначно, оскільки я завжди посилаюсь на його псевдонім таблиці.

Будь-які ідеї, звідки походить ця помилка? Це йде від MigrateSQLMap вгорі? Якщо так, то як я можу посилатись labelIdна це псевдонімом, щоб зробити його неоднозначним? Я спробував це зробити l.labelId, але це не вийшло.

Відповіді:


30

Зрозумів це!

При визначенні поля в MigrateSQLMap я можу встановити псевдонім таблиці для поля:

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

У 'alias' => 'l'ВИРОБЛЯЄ labelIdстали l.labelIdв запитах.


Дякую. Була така ж проблема. Ви повинні позначити свою відповідь правильною.
Perisdr

Та ж проблема ... і рішення прекрасно працює. Я витратив занадто багато годин на цей! Дякуємо, що опублікували виправлення.
море26.2

Ви заслужили медаль за цей акуратний шматочок.
doublejosh

1

Я думав , що він сідав aliasдо 1(тобто булевої правді), але є причина , це рядок - це фактичний псевдонім, так що якщо ви псевдонім n, 'alias' => 'n'. Це фактично коштувало мені приблизно 1/2 години.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.