마이그레이션 모듈을 사용하여 마이그레이션


8

Drupal 7과 최신 Migrate 모듈을 사용하고 있습니다. OpenCart DB에서 새로운 D7 사이트로 제품을 마이그레이션하는 클래스를 만들려고합니다. 필요한 모든 SQL을 알아 내고 프로그래밍 된 대부분을 얻었습니다. 그러나 카테고리를 어떻게 처리할지 이해하는 데 약간의 어려움이 있습니다.

나의 마이그레이션 대상은 Ubercart입니다.

내가 이해하려고하는 것은 Migrate의 하위 모듈 인 migrate_example 모듈에 있습니다. 특히 WineWineMigration 클래스에서 wine.inc 파일을보고 있습니다. 마이그레이션이라는 용어를 이해하려고합니다.

Ubercart 제품에서 분류 용어가 될 두 가지 목록이 있습니다. 먼저 카테고리입니다. 범주를 수동으로 설정 했으므로 GROUP_CONCAT SQL 기능을 사용하여 그 목록을 가져올 때 모든 ID 변환을 보유 할 배열을 사용하여 매핑 할 ID가 많이 있습니다. 괜찮습니다. 그러나 내가 마이그레이션하는 BestWith 정보를 보면 위의 WineBestWith 클래스를 사용하여 용어를 가져오고 있음을 알 수 있습니다.

용어의 이차 마이그레이션처럼 보이기 때문에 혼란 스럽습니다. 그게 무슨 일이야? 또한,이 용어를 마이그레이션 클래스에서 매핑 배열을 넣을 위치입니까?

다음으로해야 할 일은 태그를 다루는 것입니다. OpenCart에는 많은 자유 형식 태그가 있습니다. 그리고 Ubercart에서 제품을 수동으로 만들면 태그에 대한 자동 완성 필드가 있습니다. 해당 필드에 쉼표로 구분 된 용어 목록을 입력하면 여러 용어가 생성됩니다. Migrate 모듈에서 동일한 작업을 수행 할 수 있습니까? 필드를 쉼표로 구분 된 용어 목록에 매핑 할 수 있습니까? 각 제품마다 태그가 추가됩니까?

답변:


14

나는 지금 같은 문제를 해결하고 있으므로 귀하의 혼란을 이해합니다. 많은 질문이 있지만 단일 질문으로 요약 할 수 있다고 생각합니다.

마이그레이션 모듈은 정규화 된 데이터베이스를 Drupal 설치로 마이그레이션하는 것을 어떻게 처리합니까?

분명히 간단하지는 않지만 작동 방식에 대한 이해가 있습니다. 맨 위 (WineWineMigration)에서 내려 가면서 질문을합니다.

우리는 WineWineMigration수업 상단의 코드를 살펴보면서 시작합니다 .

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

이렇게하면 마이그레이션 모듈에 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를 기반으로 맵핑한다고 가정하지만, 2 차 이주에 의존하므로 이주를 지정하고 지시해야합니다. 필드 이름 대신 tids를 사용하십시오.

소스 데이터베이스에있는 모든 정규화 된 테이블에 대해 각각 마이그레이션을 지정한 다음 해당 테이블과 관련된 관련 필드 매핑에서 필드 매핑 호출에 종속 마이그레이션을 지정합니다. 각 마이그레이션 시작시 종속 마이그레이션 선언과 함께

이게 도움이 되길 바란다. 나는 이것을 완전히 이해하지 못하기 때문에이 질문을 Migrate와 데이터베이스의 관계에 대한 이해를 향상시킬 수있는 기회로 사용했습니다. 조금 더 배우면 그에 따라 답변을 업데이트합니다.


1
설명이 필요한 경우 알려주세요. 이 게시물은 내가 깨달은 약간의 뇌 덤프입니다.
Lester Peabody
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.