여러 값을 가진 엔터티 필드 조건으로 쿼리 수행


14

사용자가 해당 필드에 여러 분류 용어를 추가 할 수있는 엔티티 참조 필드가있는 컨텐츠 유형이 있습니다. 해당 필드 내에 특정 분류 용어가있는 노드를 가져 오는 쿼리를 수행하려고합니다.

해당 필드에 하나의 값을 사용하면 정상적으로 작동합니다.

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

여기서 2는 내가 검색하는 용어의 ID입니다. 그러나 두 개의 특정 용어가 포함 된 노드를 검색하려고하면

    $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 중있는 모든 노드를 표시 OR 용어 대신 제 2 항 AND 의도 항 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();

이것은 필드에 몇 개의 용어가 있는지 또는 어떤 델타에 있는지에 관계없이 작동합니다.

편집하다

결과는 다음과 같습니다.

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 :: condition 문서를 참조하십시오 .


1
나는 대답을 구현했지만 어떤 이유로 든 올바른 결과를 표시하지 않습니다. [2], 'IN'또는 [8], 'IN'과 같은 $ and 조건 중 하나만 사용하면 결과가 올바르게 표시되지만 둘 다 사용하면 결과가 표시되지 않습니다. 두 노드가 모두 있는지 확인하기 위해 트리플을 확인했습니다.
Matt

1
entityQuery는 기본적으로 AND를 사용하므로이를 고려하면 AND conditionGroup이 필요하지 않습니다.
Eyal

1
좋아, 그냥 $ query-> condition ()을 사용하여 변경했지만 둘 다 사용할 때 아무런 결과가 표시되지 않는 문제가 계속 발생합니다.
Matt

1
당으로 의 QueryInterface :: 조건 문서는 델타에 조건을 적용 할 수 있습니다. 예제 코드로 답변을 업데이트하겠습니다.
Eyal

1
@Eyal, AND 조건 그룹은 중복 된 것으로 보이지만 실제로 동일한 필드에 여러 조건을 지정하는 데 도움이됩니다. 각 조건을 별도의 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.