it-swarm-vi.com

Việc sử dụng EntityFieldQuery đúng cách là gì?

Trong Drupal 7, tài liệu API cho node_load_multiple() chỉ định sử dụng tham số $conditions Đã không được hỗ trợ khi sử dụng EntityFieldQuery. người ta sử dụng lớp để tạo danh sách ID nút để sử dụng với node_load_multiple()? Có trường hợp sử dụng nào khác cho nó không?

37
user7

EntityFieldQuery sử dụng một tập hợp các hook để giao tiếp với các mô đun lưu trữ trường, như Field SQL Storage, để làm việc cho các trường cũng như các thuộc tính nút khác. Về lâu dài, EntityFieldQuery là một cách đáng tin cậy hơn để truy vấn bất kỳ loại thực thể nào và trong một số trường hợp, nó có thể thực hiện các truy vấn thực thể chéo (xem field_has_data hoặc _ list_values_in_use () cho một thí dụ.

Đây là một ví dụ đơn giản về việc sử dụng EntityFieldQuery để lấy danh sách tất cả các nút được xuất bản trước dấu thời gian cụ thể:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ kết quả từ truy vấn đó sẽ trông giống như thế này:

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

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

        )

)

Sau đó, bạn có thể sử dụng mảng đó làm đầu vào cho node_load_multipl:

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

Tôi đã tìm thấy một vấn đề trên Drupal về việc thêm ví dụ cho EntityFieldQuery. Tôi đã sử dụng nó cho các ví dụ cũng như để nói lên ý kiến ​​của tôi về cuộc gọi để biết thêm ví dụ.

" Chúng ta có cần một ví dụ EntityFieldQuery không? "

nhận xét # 11 hiển thị việc sử dụng node_load_multiple() như được thấy bên dưới:

$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

Đây là một ví dụ từ một trong các mô-đun thử nghiệm:

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

Điều này chọn các nút có trường cơ thể bắt đầu bằng "A". Xem thêm EntityFieldQuery :: exec () về cách sử dụng kết quả trả về.

Có nhiều trường hợp sử dụng, ví dụ điển hình là truy vấn các thực thể cho giá trị trường cụ thể như trường cơ thể như trong ví dụ đầu tiên.

Ưu điểm là nó hoạt động bất cứ trường nào bạn đang sử dụng. Ví dụ: bạn có thể có các trường của mình trong MongoDB và EntityQuery vẫn sẽ hoạt động trong khi truy vấn field_data_body theo cách thủ công sẽ không.

8
Berdir

Bạn có thể sử dụng lớp EntityFieldQuery để truy vấn cơ sở dữ liệu và tìm nạp các kết quả dưới dạng danh sách tương tự node_load_multiple() .

Điều này có thể đạt được bằng cách tạo một lớp, áp dụng các điều kiện và thực hiện truy vấn, ví dụ:

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

Điều này sẽ tạo ra các mảng như:

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',
    )),
  ),
)

Để tìm nạp ID từ mảng kết quả, bạn có thể sử dụng: current(current($result))->tid.

Đây là ví dụ nâng cao hơn:

<?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);
}
?>

Xem: Cách sử dụng EntityFieldQuery tại Drupal.org để được giải thích thêm.

0
kenorb