การโยกย้ายล้มเหลว: เมื่ออนุประโยคไม่ชัดเจน


9

ฉันทำงานกับmigrateโมดูลเป็นครั้งแรกและฉันทำงานกับdb_selectapi นิดหน่อย แต่ฉันพบข้อผิดพลาด

ฉันกำลังพยายามแปลงป้ายกำกับเก่า ๆ ให้เป็นอนุกรมวิธานแบบ drupal เมื่อฉันเรียกดู/admin/content/migrateเพจแบบสอบถามของฉันจะทำอย่างถูกต้องและแสดงจำนวนแถวที่ถูกต้องที่ควรย้ายข้อมูล อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้การนำเข้าฉันได้รับข้อผิดพลาดนี้:

การโยกย้ายล้มเหลวโดยมีข้อยกเว้นปลั๊กอินต้นทาง: SQLSTATE [23000]: การละเมิดข้อ จำกัด ด้านความสมบูรณ์: 1052 คอลัมน์ '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

คุณสมควรได้รับเหรียญสำหรับบิตนั้น
doublejosh

1

ผมคิดว่าเขาได้รับการตั้งค่าaliasไป1(เช่นความจริงบูล) แต่มีเหตุผลที่มันเป็นสตริง - นั่นคือนามแฝงที่เกิดขึ้นจริงดังนั้นหากคุณกำลังนามแฝงคือ,n 'alias' => 'n'ที่จริงค่าใช้จ่ายฉันประมาณ 1/2 ชั่วโมง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.