Pracuję teraz nad tym samym problemem, więc rozumiem twoje zamieszanie. Masz wiele pytań, ale myślę, że można je podsumować w jednym pytaniu:
Jak moduł Migrate obsługuje migrację znormalizowanej bazy danych do instalacji Drupal?
Zdecydowanie nie jest to proste, ale rozumiem, jak to działa. Zaczniemy od góry (WineWineMigration), idąc w dół i zadając pytania.
Zaczynamy od spojrzenia na kod na szczycie WineWineMigration
klasy.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Mówi to modułowi Migrate, że aby przeprowadzić migrację zawartości Wine, migracje zależne - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - muszą zostać zakończone w pierwszej kolejności.
Nauczyliśmy się tutaj, że migracje mogą zależeć od innych migracji .
Następnie mamy mapowanie między tabelą, która obecnie zawiera podstawowe informacje o winie, a węzłem Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Jest to dość proste, więc jeśli potrzebujesz wyjaśnienia, udzielę go.
Pominę kilka tymczasowych rzeczy, które tak naprawdę nie są odpowiednie do łączenia różnych kategorii i przedmiotów do wina.
Teraz przechodzimy do mapowań pól. Przestrzegać:
// 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');
Zobacz, gdzie jest napisane:
->sourceMigration(...)
Wskazuje to migracji, że aby zmapować to pole, najpierw należy spełnić inną migrację. Wierzę, że jest to „migracja wtórna”, o której mówiłeś. Użyjmy region
mapowania pól jako przykładu tutaj. Rozbijam to ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Oznacza to, że region kategorii w źródłowej bazie danych jest odwzorowany na termin regionu. Jak stwierdza TIP w części kodu odwzorowań pól, zakłada się, że odwzorowania są tworzone na podstawie nazw_pola, ale ponieważ, jak to ująłeś, jesteśmy zależni od migracji wtórnej, musimy określić migrację, od której zależy, i poinstruować ją używaj pływów zamiast nazw pól.
Tak więc prawie dla każdej znormalizowanej tabeli, którą masz w źródłowej bazie danych, będziesz określał migrację dla każdej, a następnie w odpowiednich odwzorowaniach pól obejmujących te tabele, będziesz określał migracje zależne w wywołaniach odwzorowywania pól , a także deklarację migracji zależnych na początku każdej migracji.
Mam nadzieję, że to pomoże. Sam tego nie rozumiem w pełni, więc skorzystałem z tego pytania, aby lepiej zrozumieć, w jaki sposób Migrate wiąże bazy danych. Gdy nauczę się nieco więcej, odpowiednio zaktualizuję swoją odpowiedź.