移行の失敗: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たがうまくいきませんでした。

回答:


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

あなたはその一口のためにメダルに値します。
doublejosh 2014年

1

私は彼が(つまり、ブール値true)に設定aliasしていると思いましたが1、それが文字列である理由があります-それが実際のエイリアスなので、エイリアスがである場合n'alias' => 'n'です。それは実際に約1/2時間かかりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.