마이그레이션 실패 : on 절이 모호합니다.


9

나는 migrate처음으로 모듈을 사용하고 있으며 db_selectAPI를 약간 사용했지만 오류가 발생했습니다.

오래된 레이블을 드루팔 분류법으로 변환하려고합니다. /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작동하지 않았다.

답변:


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'차종이 labelIdl.labelId쿼리에.


감사. 같은 문제가 있었다. 정답으로 표시해야합니다.
Perisdr

동일한 문제 ... 및 솔루션이 완벽하게 작동합니다. 나는 이것에 너무 많은 시간을 보냈다! 수정 사항을 게시 해 주셔서 감사합니다.
sea26.2

그 tid bit에 메달을받을 자격이 있습니다.
doublejosh

1

나는 그가 설정 한 생각 alias1당신이있는 거 별칭이 그렇다면, 실제 별명입니다 - (즉, 부울 사실)하지만 문자열의 이유가있다 n, 'alias' => 'n'. 실제로 약 1/2 시간이 걸렸습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.