EntityFieldQuery의 올바른 사용법은 무엇입니까?


37

Drupal 7에서는 매개 변수를 node_load_multiple()사용하여 지정 하기위한 API 문서 $conditions가 사용되지 않기 때문에 사용되지 않습니다 EntityFieldQuery. 클래스를 사용하여 노드 ID 목록을 생성하는 방법은 node_load_multiple()무엇입니까? 다른 사용 사례가 있습니까?

답변:


36

EntityFieldQuery는 후크 세트를 사용하여 Field SQL Storage와 같은 필드 스토리지 모듈과 인터페이스하여 필드 및 기타 노드 특성에 대해 작업합니다. 장기적으로 EntityFieldQuery는 모든 유형의 엔티티를 쿼리하는 훨씬 안정적인 방법이며, 경우에 따라 교차 엔티티 쿼리를 수행 할 수 있습니다 ( field_has_data 또는 _list_values_in_use () 참조 ) .

다음은 EntityFieldQuery를 사용하여 특정 타임 스탬프 전에 게시 된 모든 노드 목록을 가져 오는 간단한 예입니다.

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

해당 쿼리의 $ results는 다음과 같습니다.

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

그런 다음 해당 배열을 node_load_multiple의 입력으로 사용할 수 있습니다.

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_data는 _list_values_in_use보다 더 좋은 예입니다.

15

Drupal에서에 대한 예제 추가와 관련된 문제를 발견했습니다 EntityFieldQuery. 나는 더 많은 예제에 대한 전화에 대한 의견을 제시하기 위해 예제로 사용했습니다.

" EntityFieldQuery 예제가 필요합니까? "

주석 # 11 의 쇼 사용량 node_load_multiple()아래와 같이 :

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

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

2
주의해야합니다. fieldOrderBy 메소드는 관련 필드가있는 노드를 비 웁니다. 혼란스러운 원인은 정렬하고 필터링하지 않는 것입니다 (빈 필드가있는 노드는 결과 집합의 맨 위 또는 맨 아래에있을 것으로 예상합니다). 더 많은 정보와 희망 수정은 여기에서 찾을 수 있습니다 drupal.org/node/1611438 여기 drupal.org/node/1662942
마리오 아 와드

9

다음은 테스트 모듈 중 하나의 예입니다.

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

본문 필드가 "A"로 시작하는 노드를 선택합니다. 반환 된 결과를 사용하는 방법에 대해서는 EntityFieldQuery :: execute () 도 참조하십시오 .

많은 사용 사례가 있으며 일반적인 예는 첫 번째 예에 표시된대로 본문 필드와 같은 특정 필드 값에 대해 엔티티를 조회하는 것입니다.

장점은 사용중인 field_storage에 관계없이 작동한다는 것입니다. 예를 들어 MongoDB에서 필드를 가질 수 있으며 field_data_body를 수동으로 쿼리하지 않으면 EntityQuery가 계속 작동합니다.


0

당신은 사용할 수 있습니다 EntityFieldQuery의 데이터베이스를 쿼리와 유사 목록의 형태로 결과를 가져 클래스를 node_load_multiple().

이것은 클래스를 생성하고 조건을 적용하고 쿼리를 실행하여 달성 할 수 있습니다. 예를 들면 다음과 같습니다.

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

그러면 다음과 같은 배열이 생성됩니다.

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

결과 배열에서 ID를 가져 오려면 다음을 사용할 수 있습니다 current(current($result))->tid..

다음은 더 고급 예입니다.

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

자세한 설명은 Drupal.org 에서 EntityFieldQuery 사용 방법을 참조하십시오 .

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