Tôi đang làm việc với cùng một vấn đề ngay bây giờ để tôi hiểu sự nhầm lẫn của bạn. Bạn có rất nhiều câu hỏi, nhưng tôi nghĩ chúng có thể được tóm tắt thành một câu hỏi số ít:
Làm thế nào để mô-đun Migrate xử lý việc di chuyển cơ sở dữ liệu đã chuẩn hóa vào bản cài đặt Drupal?
Nó chắc chắn không đơn giản, nhưng đây là sự hiểu biết của tôi về cách thức hoạt động. Chúng ta sẽ bắt đầu từ đầu (WineWineMigration) đi xuống và đặt câu hỏi khi chúng ta đi.
Chúng tôi bắt đầu bằng cách nhìn vào mã ở đầu WineWineMigration
lớp.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Điều này nói với mô-đun Di chuyển rằng để di chuyển nội dung Wine của bạn, việc di chuyển phụ thuộc - WineVariety, WineRegion, WineBestWith, WineUser, Wine sản xuất - phải được hoàn thành trước tiên.
Vì vậy, những gì chúng ta đã học được ở đây là di cư có thể phụ thuộc vào di cư khác .
Tiếp theo, chúng ta có ánh xạ giữa bảng hiện chứa thông tin rượu cơ sở và nút Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Điều này khá đơn giản vì vậy nếu bạn cần làm rõ tôi sẽ cung cấp nó.
Tôi sẽ bỏ qua một số thứ tạm thời không thực sự thích hợp để kết nối các danh mục và đối tượng rượu khác nhau.
Bây giờ chúng ta đến bản đồ trường. Quan sát:
// Mapped fields
$this->addFieldMapping('title', 'name')
->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
->sourceMigration('WineUser')
->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
->sourceMigration('WineVariety')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
->separator(',')
->sourceMigration('WineBestWith')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');
Xem nơi nó nói:
->sourceMigration(...)
Điều này cho biết việc di chuyển rằng để ánh xạ trường này, trước tiên phải di chuyển một di chuyển khác. Tôi tin rằng đây là "di cư thứ cấp" mà bạn đã nói đến. Hãy sử dụng region
ánh xạ trường làm ví dụ ở đây. Phá vỡ nó ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Điều này nói rằng khu vực danh mục trong cơ sở dữ liệu nguồn được ánh xạ tới một thuật ngữ từ vựng khu vực. Vì nhận xét TIP nêu trong đoạn mã ánh xạ trường, nó giả định rằng ánh xạ được tạo dựa trên trường_names, nhưng vì chúng tôi phụ thuộc vào di chuyển thứ cấp khi bạn đặt nó, nên chúng tôi cần chỉ định di chuyển phụ thuộc vào nó và hướng dẫn nó sử dụng tids thay vì tên trường.
Quá nhiều cho mỗi bảng được chuẩn hóa trong cơ sở dữ liệu nguồn của bạn, bạn sẽ chỉ định di chuyển cho từng bảng và sau đó trong ánh xạ trường có liên quan đến các bảng đó, bạn sẽ chỉ định di chuyển phụ thuộc trong các lệnh gọi ánh xạ trường của bạn , cũng như khai báo di chuyển phụ thuộc vào đầu mỗi di chuyển.
Tôi hi vọng cái này giúp được. Tôi hoàn toàn không hiểu điều này vì vậy tôi đã sử dụng câu hỏi này như một cơ hội để nâng cao hiểu biết của mình về cách Di chuyển liên quan đến cơ sở dữ liệu. Khi tôi tìm hiểu thêm một chút, tôi sẽ cập nhật câu trả lời của mình cho phù hợp.