初めてmigrate
モジュールを使用していて、_db_select
_ APIを少し使用しましたが、エラーが発生しています。
古いラベルを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
_にしてみましたが、うまくいきませんでした。
理解した!
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
にします。
私は彼がalias
を1
(つまり、ブール値true)に設定していると思いましたが、それが文字列である理由があります-それが実際のエイリアスなので、エイリアスがn
、'alias' => 'n'
。実際には約1時間半かかりました。