Score:2

EntityQuery ที่เขตข้อมูลที่มีหลายค่าประกอบด้วยค่า

ธง de

ฉันเขียนโปรแกรมมา 15 ปี 10 ปีด้วย PHP แต่ในโครงการ Drupal แรกของฉัน การใช้ Drupal 9

ฉันกำลังพยายามดึงเอนทิตี (ประเภทเนื้อหาที่กำหนดเอง) ที่มีฟิลด์เอนทิตี (ผู้ใช้) ที่มีหลายค่า 2 ช่อง หากค่าที่ฉันมีอยู่ในช่องหนึ่ง ฉันต้องการรับอีกช่องหนึ่ง ปัญหาคือฉันไม่สามารถหาวิธีขอเอนทิตีเมื่อค่าสเกลาร์ที่ฉันมีอยู่ในรายการ นี่คือสิ่งที่ฉันมี:

กลับ \Drupal::entityQuery('โหนด')
  ->เงื่อนไข ('ประเภท', 'osj_relationships')
  ->condition('field_supervised_reps', [$userId], 'IN')
  ->ดำเนินการ ();

ซึ่งสร้าง SQL นี้:

'เลือก "base_table"."vid" เป็น "vid", "base_table"."nid" เป็น "nid"
จาก
"โหนด" "base_table"
INNER JOIN "node_field_data" "node_field_data" บน "node_field_data"."nid" = "base_table"."nid"
เข้าร่วมภายใน "node__field_supervised_reps" "node__field_supervised_reps" บน "node__field_supervised_reps"."entity_id" = "base_table"."nid"
WHERE ("node_field_data"."type" = 'osj_relationships') และ ("node__field_supervised_reps"."field_supervised_reps_target_id" IN ('2458'))'

ส่วนที่ 2 ของส่วนคำสั่ง WHERE กำลังมองหาค่าฟิลด์ในพารามิเตอร์ของฉัน ฉันต้องการให้ค้นหาพารามิเตอร์ของฉันในฟิลด์ ฉันได้ลอง CONTAINS แล้ว แต่ดูเหมือนว่าจะถือว่าค่าฟิลด์เป็นสตริงแทนที่จะเป็นอาร์เรย์ ถ้าฉันสามารถหมุน WHERE clause รอบ ๆ มันจะสมบูรณ์แบบ เช่น.

(('2458') ใน "node__field_supervised_reps"."field_supervised_reps_target_id") 

ฉันคิดว่าฉันสามารถใช้ 'CONTAINS' ได้หากฉันสามารถแทรกรายการฟิลด์ได้ แต่นั่นอาจเสี่ยงต่อการถูกโจมตีที่ผิดพลาด

ข้อเสนอแนะใด ๆ

Score:2
ธง in

คุณไม่จำเป็นต้องใช้ ใน ที่นี่ เฉพาะในกรณีที่คุณมีหลายรายการ รหัสผู้ใช้ $s มิฉะนั้นตัวดำเนินการ = จะทำงาน:

กลับ \Drupal::entityQuery('โหนด')
  ->เงื่อนไข ('ประเภท', 'osj_relationships')
  ->เงื่อนไข ('field_supervised_reps', $userId)
  ->ดำเนินการ ();

ข้อความค้นหาที่สร้างขึ้นจะทำงานตามที่คุณต้องการ ใช้งานได้เนื่องจากแต่ละค่าของเขตข้อมูลที่มีหลายค่าถูกจัดเก็บไว้ในแถวของตัวเองในฐานข้อมูล

ตัวอย่างเช่น ระบุฟิลด์อ้างอิงเอนทิตีหลายค่า field_tags เพิ่มลงในโหนดบทความ หากคุณมีบทความ (ที่มี id = 111) ที่อ้างอิงคำศัพท์อนุกรมวิธานสองคำที่มีรหัส 222 และ 333 node__field_tags ตารางอาจมีลักษณะดังนี้:

กำ ลบแล้ว เอนทิตี_id revision_id รหัสภาษา เดลต้า field_tags_target_id
บทความ 0 111 777 th 0 222
บทความ 0 111 777 th 1 333
Ed Coakley avatar
de flag
ขอบคุณสำหรับการตอบกลับ. ฉันเพิ่งเริ่มยุ่งกับ 'in' & 'contains' หลังจาก '=' ไม่ทำงาน นอกจากentityQuery() ฉันยังได้ลองใช้entityTypeManager(): กลับ \Drupal::entityTypeManager() ->getStorage('โหนด') ->loadByProperties([ 'type'=>'osj_relationships', 'field_supervised_reps'=>$userId ]); ...ด้วยผลลัพธ์เดียวกัน (อาร์เรย์ว่าง) ฉันได้ตรวจสอบแล้วว่าเป้าหมายที่ฉันกำลังมองหาอยู่ในฐานข้อมูลและชื่อฟิลด์นั้นถูกต้อง ฉันได้ลอง intval($userid) ซึ่งก็ไม่ได้เปลี่ยนแปลงอะไรเลย ข้อเสนอแนะอื่น ๆ ?
Ed Coakley avatar
de flag
เมื่อตรวจสอบอย่างใกล้ชิด ฉันพบปัญหาการสะกดเมื่อฉันสร้างชนิดเนื้อหา เช่นเคย เจ้าเครื่องจักรโง่ๆ ทำตามที่มันบอก 'osj_releationships' != 'osj_releationships' ฮึ. ขอบคุณที่อย่างน้อยก็ยืนยันว่าฉันเห่าต้นไม้ที่ถูกต้อง

โพสต์คำตอบ

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