実際、2012年はそれほど難しいことではないようです。はい、ソースIDとインポートIDを追跡する必要がありますが、移行モジュールは、きちんとした小さなテーブルでこれを実行します。ソースクエリでそのテーブルを結合し、ノード参照フィールドを..参照ノードのnidで更新できます。もちろん、参照されるノードはすでにインポートされているはずです。それらがなかった場合は、後で「更新」の実行を実行でき、参照されたnidは後者のインポートに基づいて入力されます。実際には:
$query = Database::getConnection(
'default', 'mysourcedb'
)->select(
'mysourcetable','source'
)->fields('source', array(
'id',
'title',
'whatever'
'rel_rec_id'
)
);
$query->leftJoin('migrate_map_relimport','relmap','relmap.sourceid1=source.rel_rec_id');
$query->addField('relmap','destid1','rel_node_id');
上記のコードは、「rel_rec_id」を参照する「mysourcetable」を含む「mysourcedb」があり、rel_rec_idが参照しているrelテーブルをインポートするRelImportという別のインポートがあることを前提としています。すでに実行されている必要があります(または、追加の更新を実行する前に実行されます)。RelImportクラスを取得したら、migrate-statusを実行して、テーブルが存在することを確認します。
'migrate_map_relimport'テーブルに結合できるようにするには、マップテーブルがdrupalデータベースではなくソースデータベースに書き込まれていることを確認してください。これは必ずしも必要ではありませんが、ここにあります。
$this->map = new MigrateSQLMap(
$this->machineName,
array(
'id' => array(
'type' => 'int',
'unsigned' => true,
'not null' => true,
'alias' => 'source'
)
),
MigrateDestinationNode::getKeySchema(),
'mysourcedb' // connection to use to write map tables
);
最後に、取得したrel_node_idをノード参照に割り当てます。
$this->addFieldMapping( 'field_rel_node', 'rel_node_id' );
ええ、それはロケット科学です.. YMMV
*-パイク