EntityFieldQuery를 사용하여 일부 필드 만 가져 오시겠습니까?


19

Drupal 7에는 EntityFieldQuery를 사용하여 매우 유망한 ORM 유사 쿼리 시스템이 있습니다.

현재 노드를 선택하는 방법을 알고 있지만 결과에는 파일 등의 특정 정보가 포함되어 있지 않습니다.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

따라서 현재 예에서 'field_date'와 같이 한 필드의 값만 가져 오려면 노드의 전체 데이터를로드해야합니다.

$nodes = entity_load('node', array_keys($entities['node']));

필드 값을 얻는 방법이 있다면 메모리 오버로드를 유발하기 때문에 모든 노드의 전체 데이터를로드하는 대신.

$nodesFieldDates = ???

답변:


10

좋은 질문입니다!

EntityFieldQuery 정말 좋은 일이지만, 정말로 진지하게 만들고 싶다면 사용자 정의 모듈에서 클래스를 재정의하고 거기에서 수행해야 할 동작을 추가해야합니다.

나는 당신의 정확한 의도를 모르지만 과거의 주제에 대해이 기사 를 언급했습니다 . 잘 쓰여진 글쓰기에 대한 Neil Hastings의 공로.

좋은 예제를 보려면 기사에서 약간의 코드 예제를 찾으십시오.

도움이되기를 바랍니다.


알 겠어 ! 따라서 "EntityFieldQuery" "buildQuery"메소드를 재정 의하여 결과 필드를 대체 할 수 있습니다. 아마도 이것이 효과가있을 것입니다.
Fedir RYKHTIK

11

나는 이것에 대한 답을 찾았다! Apache Solr 모듈 은이를 수행 하기 위해 EntityFieldQuery 클래스확장합니다 . addExtraField라는 새로운 메소드를 추가합니다.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Apache Solr이 설치되어 있지 않은 경우 해당 클래스를 확장하기위한 코드를 복사하십시오.


Apache Solr 모듈에 몇 가지 단점이 있었기
mikeytown2

2
mikeytown2에 의해 만들어진 (현재 샌드 박스) 모듈에 대한이 답변을 단순히 찬성했습니다 (감사합니다!)
Oliver Coleman

답변의 링크가 작동하지 않는 것 같습니다. "계속하기 전에 로그인하거나 가입해야합니다."라고 표시되어 있습니다.
mbomb007



0

여전히 EFQ에서 필드를 가져 오려는 사람은 EFQ 추가 필드 모듈을 살펴보십시오 .

경고 :이 모듈은 EntityFieldQuery를 악용하여 데이터베이스에서 데이터를 리턴합니다. 엔티티 또는 그 위에 빌드 된 모듈에서는 작동하지 않습니다.

EntityFieldQueryExtraFields 오브젝트 내에서 addField를 사용할 수 있습니다 (EntityFieldQuery 오브젝트를 확장 함). 처음에 EntityFieldQuery는 엔티티 ID, 번들 및 엔티티 유형 만 제공합니다. 이 모듈은 별도의 entity_load를 수행하지 않고도 그 위에 추가 계층을 추가합니다! 방대한 양의 데이터로 작업하고 SQL 쿼리를 줄이려면 중요합니다. EFQ는 이미이 정보에 대해 데이터베이스를 쿼리하므로 추가 필드를 제공하도록 해당 쿼리를 변경하지 마십시오. 이는 해당 데이터를 얻기 위해 단일 추가 쿼리가 수행되지 않음을 의미합니다.

entity_load 또는 이와 유사한 기능에서 발생하는 포스트 포맷팅 / 포스트 로딩에 의존하는 경우주의를 기울여야합니다. 검색된 데이터의 유효성을 확인해야합니다.

예

노드 제목을 가져 오는 중

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ( 'entity_type', 'node')
  -> propertyCondition ( 'type', 'my_bundle_type')
  -> 속성 조건 ( '상태', 1)
  -> addExtraField ( 'field_myfield', value ', value')
  -> addExtraField ( 'field_mynodereffield', nid ', nid')
  -> addExtraField ( '', '제목', '제목', '노드')
  -> fieldCondition ( 'field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> 실행 ();
가능한 조합 :
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

분야 명
추가 필드가 어느 필드에서 나오는지 지정하십시오. 기본 테이블에서 가져온 경우 비워두고 테이블 인수를 채우십시오.

기둥
열 이름을 지정하십시오.

column_alias
열의 별명을 지정하십시오.

표
선택적으로 여기에 노드 또는 사용자와 같은 것을 추가하십시오 (기본 테이블).

나는 mikeytown2에 의해이 모듈 (EFQ Extra Fields)과 (현재 샌드 박스) 모듈을 모두 시도했지만 후자는 훨씬 나아 보였고 (더 사용하기 쉽고, 더 현명한 출력), 이전보다 훨씬 잘 유지되는 것으로 보입니다. mikeytown2 샌드 박스 모듈은 drupal.org/sandbox/mikeytown2/2209909에 있습니다.
Oliver Coleman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.