it-swarm-korea.com

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

Drupal 7에서 node_load_multiple()에 대한 API 설명서는 $conditions 매개 변수를 사용하여 지정되었습니다. EntityFieldQuery를 사용하여 더 이상 사용되지 않습니다. 클래스를 사용하여 node_load_multiple()에 사용할 노드 ID 목록을 생성합니까? 다른 사용 사례가 있습니까?

37
user7

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']));
36
Mikey P

EntityFieldQuery에 대한 예제를 추가하는 방법에 대해 Drupal에서 문제가 있음을 발견했습니다. 더 많은 예제에 대한 요청에 대한 의견을 제시하기 위해 예제에 사용하고 있습니다.

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

comment # 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');
14
electblake

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

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가 계속 작동합니다.

8
Berdir

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 사용 방법 을 참조하십시오.

0
kenorb