迁移失败:on子句不明确


9

我是migrate第一次使用该模块,并且已经使用过db_selectapi了一点,但遇到了错误。

我正在尝试将一些旧标签转换为drupal分类法。当我浏览该/admin/content/migrate页面时,它会正确执行查询并显示应迁移的正确行数。但是,当我实际尝试运行导入时,出现此错误:

迁移因源插件异常而失败:SQLSTATE [23000]:违反完整性约束:1052 on子句中的列'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,但这没用。

Answers:


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 2012年

同样的问题...解决方案完美地工作。我在这上面花了太多时间!感谢您发布此修复程序。
sea26.2

您应该获得那枚奖牌。
doublejosh 2014年

1

我以为他在设置alias1(即布尔值true),但有它的一个串一个原因-那就是实际的别名,所以如果你是别名n'alias' => 'n'。这实际上花了我大约1/2个小时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.