Score:2

การใช้ API การสืบค้นเอนทิตีเพื่อระบุเอนทิตีด้วยค่าที่สัมพันธ์กัน

ธง ai

ลองนึกภาพประเภทเอนทิตีแบบกำหนดเองของ Drupal 9 สองรายการที่มีชื่อ และ .

ประเภทเอนทิตี มีสองฟิลด์ a_f1 และ a_f2.

ประเภทเอนทิตี มีสนาม b_a ซึ่งเป็นการอ้างอิงเอนทิตีที่มีประเภทเป้าหมายเป็น และจำนวนสมาชิกที่ไม่จำกัด

เราจะสร้างเอนทิตีแบบสอบถามซึ่งค้นหาเอนทิตีทุกประเภทได้อย่างไร อย่างน้อยหนึ่งในนั้น b_a การอ้างอิงเอนทิตีชี้ไปที่ เอนทิตีที่มีค่า 'v1' สำหรับฟิลด์ a_f1 และค่า 'v2' สำหรับฟิลด์ของมัน a_f2?

ไม่เหมาะสมในกรณีนี้ที่จะหา ซึ่งมีการอ้างอิงเอนทิตีหนึ่งรายการที่ชี้ไปที่ นิติบุคคลกับ a_f1 ของ 'v1' แต่ a_f2 ของ 'สิ่งอื่น' และการอ้างอิงเอนทิตีอื่นที่ชี้ไปยังสิ่งอื่น นิติบุคคลกับ a_f2 ของ 'v2' แต่ a_f1 'ค่าผิด'.

ฉันสามารถทำสิ่งนี้ได้ในขณะนอนหลับด้วยการสืบค้น SQL โดยตรง แต่นั่นเป็นสิ่งที่ขมวดคิ้วในโลกของ Drupal ฉันมีช่วงเวลาที่ยากลำบากในการหาคำแนะนำในการทำเช่นนี้ ทาง Drupal ในเอกสารอย่างเป็นทางการของ Drupal

API การสืบค้นเอนทิตีของ Drupal รองรับการทำงานนี้หรือไม่

Score:3
ธง us

รหัสต่อไปนี้จะบรรลุสิ่งที่อธิบายไว้ในคำถาม

$result = \Drupal::entityQuery('b')
  ->เงื่อนไข ('b_a.entity:a.a_f1', 'v1')
  ->เงื่อนไข ('b_a.entity:a.a_f2', 'v2')
  ->ดำเนินการ ();

ในสตริงแรกส่งผ่านไปยัง เงื่อนไข():

  • b_a เป็นชื่อเขตข้อมูล
  • .entity:ก บอกว่าฟิลด์นั้นเป็นการอ้างอิงเอนทิตีสำหรับ เอนทิตี
  • a_f1 และ a_f2 เป็นฟิลด์สำหรับ เอนทิตี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับค่าที่ยอมรับสำหรับค่าแรก เงื่อนไข() อาร์กิวเมนต์ดู QueryInterface::condition().

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

$query = \Drupal::entityQuery('b');
$group = $query->orConditionGroup()
  ->เงื่อนไข ('b_a.entity:a.a_f1', 'v1')
  ->เงื่อนไข ('b_a.entity:a.a_f2', 'v2');
$result = $query->condition($group)->execute();
ai flag
สุดยอด! ขอบคุณมาก ๆ. เห็นได้ชัดว่าฉันไม่มีสิทธิ์ในไซต์นี้ในการโหวตคำตอบของคุณหรือฉันจะทำ แต่ฉันได้ทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องแล้ว (หลังจากสร้างและทดสอบกรณีทำซ้ำ) สิ่งนี้ทำในสิ่งที่ฉันต้องการ มีเอกสารประกอบที่ไหนสักแห่งที่อธิบายว่า API จะรับรองว่าค่าทั้งสองต้องมาจากเอนทิตีที่อ้างอิงเดียวกันหรือไม่ และอธิบายวิธีสร้างแบบสอบถามสำหรับกรณีที่ฉันต้องการค้นหาเอนทิตี `b` ที่อ้างอิงถึง `a` ซึ่งมี `a_f1 = 'v1'` **และ** มี `a` โดยที่ `a_f2 = 'v2'` แต่พวกมันไม่จำเป็นต้องเป็นเอนทิตี `a` เหมือนกัน?
apaderno avatar
us flag
ฉันจะขยายคำตอบในวันพรุ่งนี้ (สำหรับฉันคือเกือบเที่ยงคืน) แต่ฉันสามารถพูดได้ว่าสำหรับรหัสที่ฉันแสดง ทั้งสองเงื่อนไขจะต้องเป็นจริงสำหรับเอนทิตีที่ส่งคืนแต่ละรายการ ในขณะนี้ คำตอบไม่ได้พิจารณาฟิลด์ที่มีหลายค่า
ai flag
ฉันได้ยืนยัน (โดยการทดลอง) ว่าวิธีการนี้ทำงานในลักษณะเดียวกันสำหรับฟิลด์หลายค่าที่มีหลายค่า (ค่าที่ระบุทั้งหมดต้องเกิดขึ้นภายในเหตุการณ์เดียวกันของฟิลด์เพื่อให้เอนทิตีหลักรวมอยู่ในผลลัพธ์ของคิวรี) หากคุณทราบว่าเอกสารที่อธิบายทั้งหมดนี้ซ่อนอยู่ที่ใด โปรดโพสต์ลิงก์ ฉันสัญญาว่าจะต้องเขินอายแน่ๆ ถ้ามันนั่งอยู่เฉยๆ แล้วฉันพลาดไป :-)
apaderno avatar
us flag
ฉันขยายคำตอบ สิ่งที่เอกสารระบุไว้คือสองเงื่อนไขสำหรับฟิลด์หลายค่าเดียวกันอ้างอิงถึงเดลต้าเดียวกัน หมายความว่าเงื่อนไขแรกสำหรับ "b_a.entity:a" ไม่สามารถอ้างอิงถึงรายการแรกและเงื่อนไขที่สองสำหรับ "b_a.entity:a" ไปยังรายการที่สามได้
ai flag
ฉันจะเพิกเฉยต่อคำแนะนำที่นี่ ซึ่งบอกให้ฉันหลีกเลี่ยงการโพสต์ความคิดเห็น "ขอบคุณ" :-) ฉันขอบคุณมากสำหรับข้อมูลที่คุณให้มา รวมถึงลิงก์ไปยังเอกสารประกอบ (ซึ่งฉันควรหาด้วยตัวเอง) และตอนนี้ดูเหมือนว่าฉัน (โดยการโพสต์ความคิดเห็น) ได้รับคะแนน "ชื่อเสียง" มากพอที่จะโหวตคำตอบของคุณ ซึ่งฉันได้ดำเนินการไปแล้ว ขอบคุณ!
apaderno avatar
us flag
บางครั้ง หน้าเอกสารประกอบที่ชัดเจนอาจไม่ใช่ตำแหน่งที่คุณพบข้อมูลที่ต้องการ นั่นเป็นเหตุผลที่บางครั้งเราไม่มองสิ่งนั้น มันเกิดขึ้นกับฉันด้วย

โพสต์คำตอบ

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