Điểm:0

Ánh xạ profile_id dựa trên uid được ánh xạ trước đó khi di chuyển hồ sơ người dùng từ tệp CSV

lá cờ us

Tôi đang cố gắng di chuyển người dùng và hồ sơ người dùng sang trang web, nơi có thể đã có cả hai thực thể. Trong trường hợp này, tôi muốn ghi đè lên các trường được chỉ định và để các trường khác ở trạng thái ban đầu. Tôi đang cố gắng lập bản đồ profile_id như thế này:

  uid:
    plugin: di chuyển_lookup
    no_stub: đúng
    # di chuyển người dùng trước
    di chuyển: thị trưởng_users
    # thuộc tính trong dữ liệu nguồn
    nguồn: lau
  hồ sơ_id:
    plugin: thực thể_lookup
    entity_type: hồ sơ
    gói: hồ sơ
    bundle_key: loại
    value_key: uid
    nguồn: '@uid'

Tuy nhiên, điều này không thành công, vì vậy profile_idvô giá trị.

Bạn có tình cờ biết làm thế nào tôi có thể sử dụng plugin entity_lookup (hoặc plugin khác) cho việc này không?

CHỈNH SỬA: Có vẻ như đây có thể là sự cố Drupal Core. Tôi đã gỡ lỗi mã của EntityLookup.php plugin và in truy vấn DB thực tế được tạo từ truy vấn thực thể:

CHỌN base_table.revision_id AS bản sửa đổi_id, base_table.profile_id AS profile_id
TỪ hồ sơ base_table
         INNER THAM GIA cấu hình hồ sơ BẬT profile.profile_id = base_table.profile_id
Ở ĐÂU (hồ sơ.uid = '153')
  VÀ (hồ sơ.type = 'hồ sơ')

Điều này hoạt động tốt và trả về kết quả sau khi được sử dụng trực tiếp với máy chủ MySQL:

bản sửa đổi_id profile_id
87 87

Tuy nhiên, $query->execute() vẫn trả về một mảng trống. Tại sao?

CHỈNH SỬA: Có vẻ như đây có thể là một lỗi: https://www.drupal.org/project/migrate_plus/issues/3230477

Điểm:1
lá cờ bd

Nếu tôi hiểu chính xác câu hỏi của bạn và đó thực sự là một lỗi (do đó không có giải pháp phù hợp cho vấn đề của bạn), tôi có thể nghĩ ra ít nhất 2 cách để bạn có thể giải quyết vấn đề này.

1. hook_migrate_prepare_row / hook_migrate_MIGRATION_ID_prepare_row

Bạn đã có thể sử dụng hook_migrate_prepare_row hoặc hook_migrate_MIGRATION_ID_prepare_row để xử lý trước dữ liệu nguồn của bạn và tìm nạp uid và id hồ sơ theo cách thủ công, đại loại như sau:

/**
 * Triển khai hook_migrate_MIGRATE_ID_prepare_row().
 */
function my_module_migrate_MIGRATE_ID_prepare_row(Hàng $row, MigrateSourceInterface $source, MigrationInterface $migration) {
  $raw_data = (đối tượng) $row->getSource()['raw'];
  // Ở đây cơ sở dữ liệu truy vấn khi cần thiết.
  // $uid = \Drupal::database()->select ...
  // $profile_id = \Drupal::database()->select ...
  $row->setSourceProperty('uid', $uid);
  $row->setSourceProperty('profile_id', $profile_id);
}

Lưu ý rằng Di chuyển cộng cung cấp một giải pháp thay thế hướng đối tượng cho các hook đó: https://www.drupal.org/docs/upgrading-drupal/customize-migrations-when-upgrading-to-drupal-8-or-later#s-migrate-plus-provides-a-prepare-row-event

2. Viết plugin quy trình của riêng bạn

Có tài liệu hay về cách viết plugin quy trình trên drupal.org: https://www.drupal.org/docs/8/api/migrate-api/migrate- process/writing-a- process-plugin

Về cơ bản nó trông như thế này:

<?php

không gian tên Drupal\my_module\Plugin\migrate\ process;

sử dụng Drupal\migrate\ProcessPluginBase;
sử dụng Drupal\migrate\MigrateExecutableInterface;
sử dụng Drupal\di chuyển\Row;

/**
 * Cung cấp plugin quy trình di chuyển 'ExtractProfileIdFromLau'.
 *
 * @MigrateProcessPlugin(
 * id = "extract_profile_id_from_lau"
 * )
 */
lớp ExtractProfileIdFromLau mở rộng ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai biến đổi($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    // Lấy id hồ sơ.
    $profile_id = \Drupal::database()->select ...
    trả về $profile_id;
  }

}

Và nó có thể được tham chiếu trong tệp migration.yml của bạn bên dưới tiến trình phần, một cái gì đó như thế này chẳng hạn:

tiến trình:
  hồ sơ_id:
    -
      plugin: extract_profile_id_from_lau
      nguồn: lau

Không chắc chắn cách nào sẽ phù hợp nhất với bạn, nhưng đó là 2 ý tưởng bạn sẽ nghĩ đến. Ít nhất đó là cách tôi sẽ thử nó.

lá cờ us
Cảm ơn, tôi sẽ thử chúng.
Điểm:0
lá cờ us

Cuối cùng, giải pháp là tạo plugin quy trình di chuyển của riêng tôi, phần quan trọng trong đó là:

$statement = \Drupal::database()
  ->chọn ('hồ sơ', 'p')
  ->trường('p', ['profile_id'])
  ->điều kiện('p.uid', $value, '0')
  ->thực thi();
$result = $statement->fetchAllAssoc('profile_id');
trả về mảng_key($result)[0];

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.