Score:0

แมป profile_id ตาม uid ที่แมปก่อนหน้านี้เมื่อย้ายโปรไฟล์ผู้ใช้จากไฟล์ CSV

ธง us

ฉันกำลังพยายามย้ายข้อมูลผู้ใช้และโปรไฟล์ผู้ใช้ไปยังไซต์ ซึ่งทั้งสองเอนทิตีอาจมีอยู่แล้ว ในกรณีนี้ ฉันต้องการเขียนทับฟิลด์ที่ระบุและปล่อยให้ฟิลด์อื่นอยู่ในสถานะเดิม ฉันกำลังพยายามทำแผนที่ profile_id แบบนี้:

  uid:
    ปลั๊กอิน: การโยกย้าย_lookup
    no_stub: จริง
    # การย้ายผู้ใช้ก่อนหน้า
    การโยกย้าย: mayors_users
    คุณสมบัติ # ในแหล่งข้อมูล
    ที่มา: lau
  profile_id:
    ปลั๊กอิน: entity_lookup
    entity_type: โปรไฟล์
    กลุ่ม: โปรไฟล์
    bundle_key: พิมพ์
    value_key: uid
    ที่มา: '@uid'

อย่างไรก็ตามสิ่งนี้ล้มเหลว profile_id เป็น โมฆะ.

คุณรู้หรือไม่ว่าฉันจะใช้ปลั๊กอิน entity_lookup (หรืออื่น ๆ ) สำหรับสิ่งนี้ได้อย่างไร

แก้ไข: ดูเหมือนว่านี่อาจเป็นปัญหาของ Drupal Core ฉันดีบั๊กโค้ดของ EntityLookup.php ปลั๊กอินและพิมพ์แบบสอบถาม DB จริงที่สร้างจากแบบสอบถามเอนทิตี:

เลือก base_table.revision_id เป็น revision_id, base_table.profile_id เป็น profile_id
จากโปรไฟล์ base_table
         INNER JOIN โปรไฟล์ โปรไฟล์ ON profile.profile_id = base_table.profile_id
ที่ไหน (profile.uid = '153')
  และ (profile.type = 'โปรไฟล์')

วิธีนี้ใช้ได้ดีและส่งคืนผลลัพธ์ต่อไปนี้เมื่อใช้กับเซิร์ฟเวอร์ MySQL โดยตรง:

revision_id profile_id
87 87

อย่างไรก็ตาม, $query->execute() ยังคงส่งกลับอาร์เรย์ที่ว่างเปล่า ทำไม

แก้ไข: ดูเหมือนว่านี่อาจเป็นข้อผิดพลาด: https://www.drupal.org/project/migrate_plus/issues/3230477

Score:1
ธง bd

หากฉันเข้าใจคำถามของคุณถูกต้องและมันเป็นข้อบกพร่องจริงๆ (ดังนั้นจึงไม่มีวิธีแก้ไขปัญหาของคุณอย่างเหมาะสม) ฉันสามารถคิดอย่างน้อย 2 วิธีที่คุณสามารถแก้ไขปัญหานี้ได้

1. hook_migrate_prepare_row / hook_migrate_MIGRATION_ID_prepare_row

คุณสามารถใช้ hook_migrate_prepare_row หรือ hook_migrate_MIGRATION_ID_prepare_row เพื่อประมวลผลข้อมูลต้นทางของคุณล่วงหน้าและดึงข้อมูล uid และรหัสโปรไฟล์ด้วยตนเอง ดังนี้:

/**
 * ใช้ hook_migrate_MIGRATE_ID_prepare_row()
 */
ฟังก์ชัน my_module_migrate_MIGRATE_ID_prepare_row (แถว $row, MigrateSourceInterface $source, MigrationInterface $migration) {
  $raw_data = (วัตถุ) $row->getSource()['raw'];
  // ที่นี่แบบสอบถามฐานข้อมูลตามต้องการ
  // $uid = \Drupal::database()->เลือก ...
  // $profile_id = \Drupal::database()->เลือก ...
  $row->setSourceProperty('uid', $uid);
  $row->setSourceProperty('profile_id', $profile_id);
}

โปรดทราบว่า โยกย้ายพลัส ให้ทางเลือกเชิงวัตถุแก่ hooks เหล่านั้น: 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. เขียนปลั๊กอินกระบวนการของคุณเอง

มีเอกสารที่ดีเกี่ยวกับวิธีเขียนปลั๊กอินกระบวนการบน drupal.org: https://www.drupal.org/docs/8/api/migrate-api/migrate-process/writing-a-process-plugin

โดยทั่วไปจะมีลักษณะดังนี้:

<?php

เนมสเปซ Drupal\my_module\Plugin\migrate\process;

ใช้ Drupal\migrate\ProcessPluginBase;
ใช้ Drupal\migrate\MigrateExecutableInterface
ใช้ Drupal\migrate\Row;

/**
 * มีปลั๊กอินกระบวนการโยกย้าย 'ExtractProfileIdFromLau'
 *
 * @MigrateProcessPlugin(
 * id = "extract_profile_id_from_lau"
 * )
 */
คลาส ExtractProfileIdFromLau ขยาย ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  การแปลงฟังก์ชันสาธารณะ ($value, MigrateExecutableInterface $migrate_executable, แถว $row, $destination_property) {
    // ดึงรหัสโปรไฟล์
    $profile_id = \Drupal::database()->เลือก ...
    ส่งคืน $profile_id;
  }

}

และสามารถอ้างอิงได้ในไฟล์ migration.yml ใต้ส่วน กระบวนการ ส่วนบางอย่างเช่นนี้:

กระบวนการ:
  profile_id:
    -
      ปลั๊กอิน: extract_profile_id_from_lau
      ที่มา: lau

ไม่แน่ใจว่าวิธีใดจะดีที่สุดสำหรับคุณ แต่นั่นคือ 2 แนวคิดที่จะนึกถึง อย่างน้อยนั่นเป็นวิธีที่ฉันจะลอง

us flag
ขอบคุณ ฉันจะลองพวกเขา
Score:0
ธง us

ในท้ายที่สุด วิธีแก้ปัญหาคือการสร้างปลั๊กอินกระบวนการย้ายข้อมูลของฉันเอง ซึ่งส่วนสำคัญคือ:

$statement = \Drupal::database()
  ->เลือก('โปรไฟล์', 'p')
  ->เขตข้อมูล ('p', ['profile_id'])
  ->condition('p.uid', $value, '0')
  ->ดำเนินการ ();
$result = $statement->fetchAllAssoc('profile_id');
ส่งคืน array_keys($result)[0];

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา