분류 용어에 여러 조건이있는 entityQuery가 결과를 리턴하지 않음


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();

편집 : entity.value 대신 원시 값을 쿼리하여 해결 방법을 찾았습니다. 이것은 바람직하지 않은 상황이지만

$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 조건을 작성하도록 요청하고 있습니다.

추신

condition('field_tags', 1);대신에 사용할 수 있습니다condition('field_tags', [1], 'IN');

주석에서 언급 한 바와 같이 AND 조건 그룹이 기본값이므로 지정할 필요가 없습니다.

PPS

두 조건 모두 참조 된 ID를 사용하여 일관성을 유지해야합니다.


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-contribute에서 저를 찾으십시오.


이것은 Drupal Core에서 수정되어야하지만 위의 솔루션은 작동합니다.
Mr.B

1

실제로 나는 이것에 대한 해킹을 발견했다. 내가 찾은 것에 대한 설명은 다음과 같습니다.

콘텐츠 유형에 각각 다른 어휘에서 분류 용어를 나타내는 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');

다시 이것은 작동하며 테스트했으며 분류 용어에 대한 참조가 컨텐츠 유형의 다른 필드에 저장되어 있어도 3 가지 분류 용어로 컨텐츠 유형 만 리턴하는 AND 조건으로 작동합니다.

나는 해킹을 자랑스럽게 생각하지 않지만 작동하지만 누군가가 시간을 절약하는 데 도움이되면 갈 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.