ดำเนินการค้นหาด้วยเงื่อนไขฟิลด์เอนทิตีที่มีหลายค่า


14

ฉันมีประเภทเนื้อหาที่มีฟิลด์การอ้างอิงเอนทิตีที่อนุญาตให้ผู้ใช้เพิ่มคำศัพท์ทางภาษีหลายคำในฟิลด์นั้น ฉันพยายามที่จะดำเนินการค้นหาที่คว้าโหนดที่มีชุดคำศัพท์เฉพาะทางภาษีภายในเขตข้อมูลนั้น

การใช้ค่าหนึ่งค่าในฟิลด์นั้นทำงานได้ดีเช่นนั้น

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', 2)
        ->sort('field_last_name', DESC);

ที่ 2 คือรหัสของคำที่ฉันค้นหา อย่างไรก็ตามเมื่อฉันพยายามค้นหาโหนดที่มีสองคำเฉพาะเช่นนั้น

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8])
        ->sort('field_last_name', DESC);

ฉันได้รับข้อผิดพลาด

หมายเลขพารามิเตอร์ไม่ถูกต้อง: จำนวนตัวแปรที่ผูกไว้ไม่ตรงกับจำนวนโทเค็น:

ฉันยังพยายาม

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8], 'IN')
        ->sort('field_last_name', DESC);

ซึ่งไม่ได้ล้มเหลว แต่ไม่ได้ให้ผลลัพธ์ที่ต้องการ มันจะแสดงทุกโหนดที่มีทั้งเทอม 2 หรือเทอม 8 แทนเทอม 2 และเทอม 8 ตามที่ตั้งใจไว้ ฉันจะทำการสืบค้นที่ตรวจสอบว่าโหนดมีค่าหลายค่าในเขตข้อมูลการอ้างอิงเอนทิตีได้อย่างไร

คำตอบ:


19

ใช้สองแยกandConditionGroup():

$query = \Drupal::entityQuery('node')
  ->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type');
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 2);
$query->condition($and);
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 8);
$query->condition($and);
$result = $query->execute();

สิ่งนี้ใช้งานได้ไม่ว่าจะมีเงื่อนไขจำนวนเท่าใดในเขตข้อมูลหรือในพื้นที่สามเหลี่ยมปากแม่น้ำ

แก้ไข

ผลลัพธ์นี้ใน SQL นี้:

SELECT base_table.vid AS vid, base_table.nid AS nid
FROM 
{node} base_table
INNER JOIN {node_field_data} node_field_data ON node_field_data.nid = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy ON node__custom_taxonomy.entity_id = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy_2 ON node__custom_taxonomy_2.entity_id = base_table.nid
WHERE  (node_field_data.status = '1') AND (node_field_data.type = 'custom_type') AND( (node__custom_taxonomy.custom_taxonomy_target_id = '2') )AND( (node__custom_taxonomy_2.custom_taxonomy_target_id = '8') )

เขาลองใช้รหัสเทียบเท่าด้านบนและไม่ได้คืนค่าใด ๆ คุณตรวจสอบว่ารหัสนี้ใช้งานได้หรือไม่
Eyal

ใช่มันใช้ได้กับฟิลด์บทความและแท็กมาตรฐานที่เต็มไปด้วยหลายแท็ก
4k4

บางทีคำแนะนำของฉันล้มเหลวเนื่องจากฉันเขียนมันชอบดังนั้น$and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
Eyal

3
แต่นั่นไม่ได้ว่าเพียงแค่ทดสอบมันทำงานร่วมกับ'IN'เกินไป สิ่งที่ทำให้เกิดความแตกต่างคือ AND และกลุ่มที่แยกจากกัน
4k4

3
ดีไม่รู้จักงานนี้ เข้าท่าเพราะนี่เป็นการบังคับให้หลายคนเข้าร่วมภายใน
Berdir

8

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

$query = \Drupal::entityQuery('node');
$query->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type')
  ->condition('custom_taxonomy', [2, 8], 'IN')
  ->condition('custom_taxonomy.%delta', 2, '=')
  ->sort('field_last_name', DESC);
$or = $query->orConditionGroup();
$or->condition('custom_taxonomy.0.target_id', 2);
$or->condition('custom_taxonomy.0.target_id', 8);
$query->condition($or);

ดูเอกสารประกอบเงื่อนไข QueryInterface ::


1
ฉันนำคำตอบไปใช้ แต่ด้วยเหตุผลบางอย่างมันไม่แสดงผลลัพธ์ที่เหมาะสม หากฉันใช้เพียงหนึ่งใน $ และเงื่อนไขเช่น [2], 'IN' หรือ [8], 'IN' จะแสดงผลลัพธ์ได้ดี แต่เมื่อฉันใช้ทั้งสองฉันจะไม่ได้รับผลลัพธ์ใด ๆ ฉันตรวจสอบสามครั้งเพื่อให้แน่ใจว่าฉันมีโหนดที่มีทั้งสองอย่าง
Matt

1
เมื่อพิจารณาถึงเรื่องนี้คุณไม่จำเป็นต้องใช้ AND กลุ่มเงื่อนไขเพราะ entityQuery ใช้ AND ตามค่าเริ่มต้น
Eyal

1
โอเคฉันเปลี่ยนเป็นแค่ใช้ $ query-> condition () แต่ฉันยังคงมีปัญหาที่เมื่อใช้ทั้งคู่มันไม่แสดงผลลัพธ์ใด ๆ
Matt

1
ตามเอกสารเงื่อนไขของQueryInterface ::คุณสามารถใช้เงื่อนไขกับเดลต้า ฉันจะอัปเดตคำตอบด้วยรหัสตัวอย่าง
Eyal

1
@Eyal กลุ่มเงื่อนไข AND ดูเหมือนว่าซ้ำซ้อน แต่ช่วยในการระบุหลายเงื่อนไขสำหรับเขตข้อมูลเดียวกัน คุณจะต้องใส่แต่ละเงื่อนไขในกลุ่มแยกต่างหาก
4k4

1
$taxonomy_term = 'taxonomy_term';
    $vid = 'name_taxon';
    $terms = $this->entity_type_manager->getStorage($taxonomy_term)
      ->loadTree($vid);

foreach ($terms as $term) {
  $term_data[] = [
    "vid" => $term->vid,
    "name" => $term->name,
  ];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.