Di chuyển thất bại: về mệnh đề là mơ hồ


9

Tôi làm việc với migratemô-đun lần đầu tiên và tôi đã làm việc với db_selectapi một chút, nhưng tôi đang gặp lỗi.

Tôi đang cố gắng chuyển đổi một số nhãn cũ thành phân loại drupal. Khi tôi duyệt đến /admin/content/migratetrang, nó thực hiện đúng truy vấn của tôi và hiển thị đúng số lượng hàng cần được di chuyển. Tuy nhiên, khi tôi thực sự cố gắng chạy nhập, tôi gặp lỗi này:

Di chuyển không thành công với ngoại lệ plugin nguồn: SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1052 Cột 'nhãnId' trong mệnh đề không rõ ràng

Đây là mã tôi có trong lớp LabelMigration của mình:

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

Nếu tôi xóa các leftJoin()cuộc gọi thì rõ ràng lỗi về oncâu lệnh sẽ biến mất, nhưng tôi không hiểu làm thế nào labelIdlà mơ hồ vì tôi luôn tham chiếu nó với bí danh bảng.

Bất kỳ ý tưởng mà lỗi này đến từ đâu? Có phải nó đến từ MigrateQueryMap ở đầu không? Nếu vậy, làm thế nào tôi có thể tham chiếu điều đó labelIdvới một bí danh để làm cho nó không mơ hồ? Tôi đã thử làm nó l.labelId, nhưng nó không hoạt động.

Câu trả lời:


30

Tìm ra!

Khi xác định trường trong MigrateQueryMap, tôi có thể đặt bí danh bảng cho trường:

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

Việc 'alias' => 'l'làm cho labelIdtrở thành l.labelIdtrong các truy vấn.


Cảm ơn. Có cùng một vấn đề. Bạn nên đánh dấu câu trả lời của bạn là chính xác.
Peritorr

Cùng một vấn đề ... và giải pháp hoạt động hoàn hảo. Tôi đã dành quá nhiều giờ cho việc này! Cảm ơn bạn đã gửi bản sửa lỗi.
biển 26.2

Bạn xứng đáng với một huy chương cho bit tid đó.
doublejosh

1

Tôi nghĩ rằng anh ta đã đặt aliasthành 1(nghĩa là boolean true), nhưng có một lý do đó là một chuỗi - đó là bí danh thực tế, vì vậy nếu bạn là bí danh n, 'alias' => 'n'. Điều đó thực sự tốn của tôi khoảng 1/2 giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.