Score:0

รับโหนดย่อยโดยทางโปรแกรมที่อ้างอิงพาเรนต์โดยการอ้างอิงเอนทิตี uuid โดยใช้ loadByProperties & entityTypeManager หรือวิธีอื่นที่ไม่มีมุมมอง

ธง cn

ฉันลองคำตอบนี้:

https://drupal.stackexchange.com/a/298084/1082

แต่ฉันดูเหมือนจะใช้ไม่ได้

'field_scientists' => $entity_reference_uuid

โดยที่ในกรณีของฉัน field_scientists เป็นฟิลด์ประเภท Entity Reference UUID - ซึ่งเป็นฟิลด์ประเภทที่จัดทำโดย https://www.drupal.org/project/entity_reference_uuid โมดูล

สิ่งที่เกิดขึ้นกับฉันคือฉันไม่ได้อะไรกลับมา อาร์เรย์ผลลัพธ์ของฉันจากตัวอย่างนั้นว่างเปล่า

ต้องการทำเช่นนี้โดยทางโปรแกรมในโมดูลที่กำหนดเองของฉันเอง แทนที่จะใช้ Drupal View

หากมีวิธีอื่นเช่น ที่ใช้ ->สอบถาม วิธีการสอบถามฐานข้อมูล ฉันยินดีที่จะใช้วิธีการทางโปรแกรมนั้น

ขอขอบคุณ.

อัปเดต

ตัวอย่างของ ยูอิด ของ โหนด ในกรณีของฉันคือ BMSSYS0000051988.

ซึ่งตั้งค่าไว้ในการนำเข้าการย้ายข้อมูลจากช่องใน CSV

ความพยายามของฉันคือ:

1. ตามตัวอย่างในคำถามอื่น: https://drupal.stackexchange.com/a/298084/1082

  $nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
    'type' => 'bol',
    'field_parent_uuid' => $taxonkey,
  ]);

2. แบบสอบถามฐานข้อมูล

$query = \Drupal::entityQuery('โหนด')
-> เงื่อนไข ('สถานะ', NODE_PUBLISHED)
->เงื่อนไข ('ประเภท', 'bol');
$and = $query->andConditionGroup();
$and->condition('field_parent_uuid', $taxonkey);
$query->condition($และ);
$result = $query->execute();

ที่ไหน $แท็กซอนคีย์ เป็น BMSSYS0000051988

ความพยายามทั้ง 1 และ 2 ครั้งด้านบนจะส่งคืนอาร์เรย์ว่าง

อัปเดต 2

นี่คือการกำหนดค่าการย้ายข้อมูลของฉันที่แสดง uuid ที่ถูกเขียนถึงจากฟิลด์ใน csv สิ่งนี้ถูกกฎหมายหรือไม่ รหัสของนักพัฒนาควรเปลี่ยนค่า uuid หรือควรจัดการ uuid โดย Drupal core เท่านั้น

การพึ่งพา: { }
รหัส: bol_csv_import
คลาส: null
field_plugin_method: null
cck_plugin_method: null
การโยกย้าย_tags: null
การโยกย้ายกลุ่ม: defaultl: publicbins
ป้ายกำกับ: 'นำเข้าข้อมูลสปีชีส์บอล'
แหล่งที่มา:
  ปลั๊กอิน: csv
  เส้นทาง: ./data/taxonomy_species_with_unpacked_bold.csv
  ตัวคั่น: ','
  สิ่งที่แนบมา: '"'
  header_offset: 0
  รหัส:
    - ยูอิด
  เขตข้อมูล:
    -
      ชื่อ: uuidl: publicbins
      ป้ายกำกับ: 'รหัส NBN'
    -
      ชื่อ: parent_uuid
      ป้ายกำกับ: 'รหัส NBN ของพาเรนต์'
    -
      ชื่อ: ชื่อ
      ป้ายกำกับ: ชื่อ
    -
      ชื่อ:ยศ
      ป้ายกำกับ: 'อันดับอนุกรมวิธาน'
    -
      ชื่อ: taxon_key
      ป้ายกำกับ: 'กุญแจภาษี'
    -
      ชื่อ: อำนาจ
      ป้ายกำกับ: ผู้มีอำนาจ
    -
      ชื่อ: specmenrecords
      ป้ายกำกับ: specmenrecords
    -
      ชื่อ: บันทึกสาธารณะ
      ป้ายกำกับ: บันทึกสาธารณะ
    -
      ชื่อ: ถังขยะสาธารณะ
      ป้ายกำกับ: ถังขยะสาธารณะ
    -
      ชื่อ:แท็กซี่
      ป้ายกำกับ: 'NBN Taxon ID'
กระบวนการ:
  หัวเรื่อง : ชื่อ
  uid:
    ปลั๊กอิน: default_value
    default_value: 1
  ยูอิด: ยูอิด
  field_parent_uuid: parent_uuid
  field_taxon_key:แท็กซอน_คีย์
  field_authority: ผู้มีอำนาจ
  field_rank: อันดับ
  field_num_bold_barcode_specimens: บันทึกตัวอย่าง
  field_num_bold_public_records: บันทึกสาธารณะ
  field_num_bold_public_bins: ถังขยะสาธารณะ
  field_bold_taxon_id: แท็กซี่
  พิมพ์:
    ปลั๊กอิน: default_value
    default_value: บอล
ปลายทาง:
  ปลั๊กอิน: 'เอนทิตี: โหนด'
การโยกย้าย_การพึ่งพา: null

ปรับปรุง 3

ฉันจะเขียนแบบสอบถาม db เพื่อแก้ปัญหานี้ การรันบรรทัดคำสั่ง sql บ่งชี้ว่าวิธีนี้อาจใช้ได้ผล:

MariaDB [db]> เลือก * จากโหนดโดยที่ nid = 246;
+-----+------+------+----------+-------- +
| นิด | วิดีโอ | พิมพ์ | ยูอิด | รหัสภาษา |
+-----+------+------+----------+-------- +
| 246 | 248 | บอล | NBNORG0000041189 | th |
+-----+------+------+----------+-------- +
1 แถวในชุด (0.001 วินาที)
4uk4 avatar
cn flag
`BMSSYS0000051988` ไม่ใช่ [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)
cn flag
+1 ขอบคุณ @4uk4 ที่อาจมีประโยชน์ `uuid` ถูกตั้งค่าเป็นสิ่งนั้นในการโยกย้าย เมื่อฉันทำ `$node->uuid();` แล้ว `BMSSYS0000051988` คือสิ่งที่ฉันได้รับกลับมา คุณรู้หรือไม่ว่าควรตั้งค่า `uuid` โดยโค้ดของผู้พัฒนาเอง หรือควรตั้งค่าโดย Drupal Core เท่านั้น
cn flag
ฉันได้เพิ่มการกำหนดค่าการย้ายข้อมูลของฉันในคำถามของฉันเพื่อแสดงว่า uuid ถูกเขียนด้วย `BMSSYS0000051988` อย่างไร หากสิ่งนี้ "ผิดกฎหมาย" เนื่องจากมีเพียง Drupal core เท่านั้นที่ควรจัดการและสร้าง/เขียน `uuid`s นั่นจะส่งเสริมกลยุทธ์ของฉัน b) ใช้วิธีแก้ปัญหาเพื่อหลีกเลี่ยงการใช้ uuid ด้วยวิธีนี้: https://drupal.stackexchange .com/questions/310697/programmatically-get-child-nodes-referencing-parent-by-entity-reference-uuid-us?noredirect=1#comment395034_310699
4uk4 avatar
cn flag
ไม่ ไม่ใช่ว่า Drupal core เท่านั้นที่ควรจัดการ UUID หนึ่งในจุดขายหลักคือ UUID นั้นไม่เหมือนใครทั่วโลก ดังนั้นคุณจึงสามารถโยกย้ายจากไซต์หนึ่งไปยังอีกไซต์หนึ่งได้ และยังคงมีเอกลักษณ์เฉพาะตัว แต่ฉันจะไม่ใช้ฟิลด์ UUID สำหรับข้อมูลอื่นที่ไม่ใช่ UUID ใส่ค่าที่ไม่ใช่ UUID ในฟิลด์ของตัวเอง และใช้ UUID เพื่ออ้างอิงข้ามรายการข้อมูลในต้นทางและ/หรือปลายทางของการย้ายข้อมูล ตำแหน่งที่คุณสร้าง UUID นั้นไม่สำคัญ
cn flag
+1 เห็นด้วย ฉันต้องการให้การย้ายข้อมูลไม่ได้นำเข้าข้อมูลฟิลด์นั้นไปยัง `uuid` และแทนที่จะเป็นฟิลด์ธรรมดาอื่นอย่างไรก็ตาม ฉันต้องทำงานกับสิ่งที่ฉันมี ดังนั้นใน 'อัปเดต 3' ฉันจะเขียนแบบสอบถาม db
Score:0
ธง cn

ตามทฤษฎีแล้วสิ่งนี้ควรใช้งานได้ ประเภทฟิลด์จะตั้งค่า UUID เป็นคุณสมบัติหลัก: EntityReferenceUuidItem:: mainPropertyName()

อาจเป็นไปได้ว่า Drupal สับสนและจัดการฟิลด์เป็นฟิลด์อ้างอิงเอนทิตีมาตรฐาน เนื่องจากขยายประเภทฟิลด์หลัก

เพื่อให้ชัดเจนว่าคุณกำลังค้นหาคุณสมบัติของฟิลด์ใด ให้ต่อท้ายด้วยจุด:

'field_scientists.target_uuid' => $entity_reference_uuid

ซึ่งควรใช้ได้กับทั้ง loadByProperties หรือแบบสอบถามเอนทิตี:

->เงื่อนไข ('field_scientists.target_uuid', $entity_reference_uuid)

อันแรกเป็นเพียงทางลัดสำหรับอันที่สองโดยใช้เครื่องมือสืบค้นเดียวกัน

cn flag
ฉันจะลองทำสิ่งนี้ในเช้าวันนี้และติดต่อกลับไปหาคุณ - ขอบคุณมาก
cn flag
โชคร้ายฉันกลัว อาร์เรย์กลับมายังคงว่างเปล่า
cn flag
บนพื้นฐานที่ว่า `เงื่อนไข` เข้าใกล้เครื่องมือสืบค้นข้อมูลเดียวกัน ฉันก็มีแนวโน้มที่จะไม่ลองเช่นกัน โดยคาดว่าปัญหาเดียวกันจะทำ 2 อย่างแทน ก) แจ้งข้อผิดพลาดใน https://www.drupal.org/project/entity_reference_uuid และ b) ใช้วิธีแก้ปัญหา สร้างฟิลด์ใหม่ในประเภทเนื้อหาของฉันซึ่งเป็นการอ้างอิงเอนทิตีเก่าธรรมดา (ไม่ใช่กับ uuid) เติมข้อมูลด้วยการอ้างอิงไปยังโหนดและทดสอบโค้ดอีกครั้ง หากใช้งานได้ให้เขียนสคริปต์เพื่อเติมโหนดที่เหลือ (แม้ว่าจะมี 100K ก็ตาม) การเติมข้อมูลจะใช้ค่าฟิลด์ uuid อ้างอิงเอนทิตีที่มีอยู่เพื่อค้นหาโหนดสำหรับฟิลด์ใหม่
4uk4 avatar
cn flag
มีวิธีการทำให้เกิดปัญหาซ้ำในการติดตั้งใหม่หรือไม่? ฉันไม่สามารถ สำหรับฉันมันใช้งานได้ทั้งที่มีและไม่มีชื่อพร็อพเพอร์ตี้ต่อท้าย
4uk4 avatar
cn flag
b) เพื่อหลีกเลี่ยงฉันจะไม่สร้างข้อมูลเพิ่มเติม ฉันจะเขียน SQL ระดับต่ำแทน นี่เป็นการทดสอบที่ดีว่า UUID ที่คุณกำลังสอบถามนั้นมีอยู่จริงหรือไม่ ระดับต่ำ เป็นแบบสอบถามง่ายๆ ในตารางเดียว
cn flag
รับทราบ ขอบคุณครับ @4uk4 การตั้งค่าของฉันดูแปลก เมื่อดูที่ฟิลด์ uuid ของการอ้างอิงเอนทิตีในโหนด มันคือสตริง ซึ่งค่านั้นมาจากฟิลด์ที่นำเข้าจาก CSV ในการแสดงโหมดแก้ไขฟิลด์นั้นจะแสดงเป็นชื่อโหนดพาเรนต์โดยมี node id อยู่ในวงเล็บ ในขณะนี้ ฉันสงสัยว่าค่าสตริงนั้นสามารถอ้างอิงโหนดพาเรนต์ได้อย่างไร เมื่อดูที่โมดูล UUID ของการอ้างอิงเอนทิตี ฉันไม่พบการกำหนดค่าใด ๆ หรือในฟิลด์ที่ให้เบาะแส ฉันไม่รู้ว่าฟิลด์ใดถูกกำหนดให้เป็น UUID จิ๊กซอว์บางชิ้นที่ขาดหายไปสำหรับฉัน
cn flag
ฉันคิดว่าฉันต้องหาวิธีรับ uuid ของโหนดเพื่อช่วยให้ฉันเข้าใจ
4uk4 avatar
cn flag
`$uuid = $node->uuid();`
cn flag
+1 ขอบคุณใช่ @4uk4 และตัวอย่าง `uuid` ในกรณีของฉันนั่นคือ `BMSSYS0000051988` ฉันได้อัปเดตคำถามของฉันด้วยพร้อมข้อมูลเกี่ยวกับสิ่งที่ฉันกำลังพยายาม ขอบคุณสำหรับความช่วยเหลือ.
cn flag
ดูเหมือนว่าฉันสับสนระหว่างค่าของข้อมูลในฟิลด์ธรรมดากับ uuid ดังนั้นคำตอบของคุณจึงถูกต้องและฉันเห็นด้วยว่าควรใช้งานได้ ฉันจะเขียนข้อมูลเพิ่มเติมในภายหลัง

โพสต์คำตอบ

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