entityQuery ที่มีหลายเงื่อนไขเกี่ยวกับเงื่อนไข taxonomy จะไม่ส่งคืนผลลัพธ์


13

ในการใช้งานของฉันฉันมีเอนทิตีที่มีสองฟิลด์ที่อ้างอิงถึงคำศัพท์เฉพาะ

ข่าว: - แท็ก (การอ้างอิงเอนทิตี) - หมวดหมู่ (การอ้างอิงเอนทิตี)

ถ้าฉันค้นหาจากการอ้างอิงเหล่านั้นฉันได้รับผลลัพธ์อย่างไรก็ตามเมื่อฉันสอบถามทั้งสองตัว (และตัวกรอง AND) ฉันจะไม่ได้ผลลัพธ์ ฉันได้ตรวจสอบสามครั้งภายในตอนนี้และมีเอนทิตีที่มีทั้งแท็กและหมวดหมู่ที่ฉันสอบถาม

นี่เป็นข้อผิดพลาดของผู้ใช้หรือข้อผิดพลาด Drupal หรือไม่

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category.entity.name', ['sport'], 'IN')
;
$query->condition($group);
$nids = $query->execute();

แก้ไข: ฉันได้พบการแก้ไขโดยการสอบถามเกี่ยวกับมูลค่าดิบแทนเอนทิตีมูลค่า นี่เป็นสถานการณ์ที่ไม่พึงประสงค์

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category', [1], 'IN')
;
$query->condition($group);
$nids = $query->execute();

การรวมเริ่มต้นสำหรับ EQ คือ AND (ซึ่งคุณสามารถเปลี่ยนได้) ดังนั้นจึงไม่มีอะไรผิดปกติกับการจัดกลุ่มเงื่อนไขร่วมกัน ... นั่นคือสาเหตุที่มันอยู่ในนั้น ฉันไม่เข้าใจสิ่งที่คุณคาดหวัง

คำตอบ:


8

สาเหตุที่คุณทำไม่ได้นั่นคือทั้งสองฟิลด์นี้เป็นเอนทิตีอ้างอิงไปยังเอนทิตีเดียวกัน นั่นหมายความว่าตารางฐานเป็นตารางฐานเดียวกัน

คุณกำลังขอให้ Drupal เข้าร่วมตาราง taxonomy_data ไปที่ตารางโหนดจากนั้นทำเงื่อนไข AND ที่เป็นไปไม่ได้

PS

คุณสามารถใช้condition('field_tags', 1);แทนcondition('field_tags', [1], 'IN');

และตามที่กล่าวไว้ในความคิดเห็นกลุ่มเงื่อนไข AND เป็นค่าเริ่มต้นดังนั้นคุณไม่จำเป็นต้องระบุ

PPS

คุณควรให้ทั้งสองเงื่อนไขใช้รหัสอ้างอิงเพื่อให้สอดคล้องกัน


1
คำตอบนี้ครอบคลุมจินตนาการที่ไร้เดียงสาว่าการสืบค้นเอนทิตีสามารถทำงานได้อย่างไร อย่างไรก็ตามมันมีความสามารถมากกว่านี้มาก ตรวจสอบคำตอบของฉัน

3

การคาดเดาที่ยังไม่ทดลอง:

$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'news');

$query = $query->condition($query->andConditionGroup()->condition('field_tag.entity.name', ['cars'], 'IN'))
  ->condition($query->andConditionGroup()->condition('field_category.entity.name', ['sport'], 'IN'));

หากสิ่งนี้ไม่ได้ผลให้ค้นหาฉันใน IRC # drupal- บริจาคในสัปดาห์หน้าและเราจะไปให้ถึงจุดสิ้นสุด


สิ่งนี้ควรได้รับการแก้ไขใน Drupal Core แต่วิธีการแก้ปัญหาข้างต้นใช้ได้ผล
Mr.B

1

ที่จริงฉันพบแฮ็คมาถึงที่นี้ นี่คือคำอธิบายของฉันของสิ่งที่ฉันได้พบ:

ฉันมี 3 ฟิลด์ในประเภทเนื้อหาของฉันแต่ละคนมีการอ้างอิงถึงคำว่าอนุกรมวิธานจากคำศัพท์ที่แตกต่างกัน และฉันต้องการค้นหาเอนทิตีสำหรับสิ่งที่มีคำศัพท์เฉพาะทางภาษีในแต่ละ 3 ฟิลด์ (และเงื่อนไข)

การตรวจสอบเคียวรี SQL ภายในที่สร้างขึ้นหลังจากพยายามหลายครั้งด้วยเงื่อนไขที่แตกต่างกันฉันพบว่า

[Previous conditions] AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_2)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_3)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_4))

อย่างที่คุณเห็นไม่มีการอ้างอิงถึงแต่ละเขตข้อมูลจริงโดยใช้คำศัพท์เฉพาะดังนั้นแฮ็คของฉันจะทำสิ่งนี้:

 $query = \Drupal::entityQuery('node')
            ->condition('status', '1')
            ->condition('type', $content_type_machine_name)
            ->condition('field_holding_term_ref.entity.name', array($label_of_term_in_field1, $label_of_term_in_field2, $label_of_term_in_field3), 'IN');

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

ฉันไม่ได้ภูมิใจกับการแฮ็ก แต่มันใช้งานได้ดังนั้นถ้าสิ่งนี้สามารถช่วยคนให้ช่วยได้บ้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.