Ошибка миграции: предложение неоднозначно

9

Я работаю с migrateмодулем впервые и db_selectнемного поработал с API, но я сталкиваюсь с ошибкой.

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

Ошибка миграции с исключением исходного плагина: SQLSTATE [23000]: Нарушение ограничения целостности: 1052 Столбец 'labelId' в предложении on является неоднозначным

Вот код, который у меня есть в моем классе 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
Та же проблема ... и решение работает отлично. Я провел слишком много часов на этом! Спасибо за публикацию исправления.
sea26.2
Вы заслуживаете медаль за этот бит.
doublejosh
1

Я думал , что он садился aliasк 1(т.е. булевой правде), но есть причина , это строка - это фактический псевдоним, так что если вы псевдоним n, 'alias' => 'n'. Это на самом деле стоило мне около 1/2 часа.

Джошуа Альберт
источник