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


37

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

Câu trả lời:


36

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 trường_has_data hoặc _list_values_in_use () để biết ví 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']));

3
field_has_data là một ví dụ đẹp hơn so với _list_values_in_use

15

Tôi tìm thấy một vấn đề trên Drupal về việc thêm các 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? "

Các bình luận # 11 chương trình sử dụng node_load_multiple()như 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');

2
Lưu ý, phương thức fieldOrderBy sẽ bỏ qua bất kỳ nút nào có trường liên quan trống. Điều này gây nhầm lẫn vì điều này chỉ được coi là sắp xếp và không lọc (bạn mong muốn các nút có trường trống nằm ở trên cùng hoặc dưới cùng của tập kết quả). Thông tin thêm và hy vọng bản sửa lỗi có thể được tìm thấy ở đây drupal.org/node/1611438 và tại đây drupal.org/node/1662942
Mario Awad

9

Đâ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.


0

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

Để lấy 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.