私は今同じ問題に取り組んでいるので、あなたの混乱を理解しています。あなたにはたくさんの質問がありますが、私はそれらを単一の質問にまとめることができると思います:
Migrateモジュールは、正規化されたデータベースのDrupalインストールへの移行をどのように処理しますか?
それは間違いなく簡単ではありませんが、これがどのように機能するかについての私の理解です。上(WineWineMigration)から下に向かって質問をしていきます。
まず、WineWineMigration
クラスの上部にあるコードを見てみましょう。
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
これは、Migrateモジュールに、Wineコンテンツを移行するために、依存する移行(WineVariety、WineRegion、WineBestWith、WineUser、WineProduce)を最初に完了する必要があることを伝えます。
したがって、ここで学んだことは、移行は他の移行に依存する可能性があるということです。
次に、現在ベースのワイン情報を保持しているテーブルとDrupalノードの間のマッピングがあります。
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
これは非常に簡単なので、説明が必要な場合は提供します。
ここでは、さまざまなカテゴリやワインオブジェクトを接続するのにあまり関係のないいくつかの暫定的なものをスキップします。
次に、フィールドのマッピングについて説明します。観察する:
// 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');
それが言うところを見てください:
->sourceMigration(...)
これは、このフィールドをマップするために、最初に別の移行が満たされる必要があることを移行に示します。これはあなたが話した「二次移住」だと思います。region
ここでは例としてフィールドマッピングを使用します。それを分解...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
これは、ソースデータベースのカテゴリ領域が領域語彙用語にマップされていることを示しています。TIPコメントはフィールドマッピングコードチャンクに記載されているように、マッピングはfield_namesに基づいて行われることを前提としていますが、ユーザーが入力するセカンダリマイグレーションに依存しているため、依存するマイグレーションを指定し、それを指示する必要がありますフィールド名の代わりにTIDを使用します。
ソースデータベースにあるすべての正規化されたテーブルについて、ほとんどの場合、それぞれの移行を指定し、それらのテーブルを含む関連するフィールドマッピングでは、フィールドマッピングの呼び出しに依存する移行を指定します、および各移行の開始時の依存する移行の宣言。
これがお役に立てば幸いです。私はこれを完全には理解していません。この質問を、Migrateがデータベースを関連付ける方法についての理解を深める機会として使用しました。もう少し学ぶと、それに応じて私の答えを更新します。