Migrasi kegagalan: pada klausa bersifat mendua

9

Saya bekerja dengan migratemodul untuk pertama kalinya dan saya telah bekerja dengan db_selectapi sedikit, tetapi saya mengalami kesalahan.

Saya mencoba mengubah beberapa label lama menjadi taksonomi drupal. Ketika saya menjelajah ke /admin/content/migratehalaman, ia melakukan kueri dengan benar dan menunjukkan jumlah baris yang tepat yang harus dimigrasi. Namun, ketika saya benar-benar mencoba menjalankan impor, saya mendapatkan kesalahan ini:

Migrasi gagal dengan pengecualian plugin sumber: SQLSTATE [23000]: Pelanggaran batasan integritas: 1052 Kolom 'labelId' di dalam klausa ambigu

Berikut adalah kode yang saya miliki di kelas LabelMigration saya:

$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('');

Jika saya menghapus leftJoin()panggilan maka jelas kesalahan tentang onpernyataan itu hilang, tapi saya tidak mengerti bagaimana labelIdambigu karena saya selalu merujuknya dengan tabel alias.

Adakah ide dari mana kesalahan ini berasal? Apakah ini berasal dari MigrateSQLMap di bagian atas? Jika demikian, bagaimana saya bisa merujuknya labelIddengan alias agar tidak ambigu? Saya mencoba membuatnya l.labelId, tetapi itu tidak berhasil.

Kenny Wyland
sumber

Jawaban:

30

Menemukannya!

Saat mendefinisikan bidang dalam MigrateSQLMap saya dapat mengatur alias tabel untuk bidang tersebut:

$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()
);

The 'alias' => 'l'merek yang labelIdmenjadi l.labelIddalam permintaan.

Kenny Wyland
sumber
Terima kasih. Punya masalah yang sama. Anda harus menandai jawaban Anda dengan benar.
Perisdr
Masalah yang sama ... dan solusinya bekerja dengan sempurna. Saya sudah menghabiskan terlalu banyak waktu untuk yang ini! Terima kasih telah memposting perbaikan.
sea26.2
Anda layak mendapatkan medali untuk waktu yang singkat.
doublejosh
1

Saya berpikir bahwa ia terbenam aliaske 1(yaitu, benar boolean), tapi ada alasan itu string - yang adalah alias yang sebenarnya, jadi jika Anda sedang alias n, 'alias' => 'n'. Itu sebenarnya menghabiskan biaya sekitar 1/2 jam.

Joshua Albert
sumber