it-swarm-id.com

Apa penggunaan EntityFieldQuery yang tepat?

Dalam Drupal 7, dokumentasi API untuk node_load_multiple() menentukan menggunakan parameter $conditions Telah ditinggalkan karena menggunakan EntityFieldQuery. Bagaimana caranya satu menggunakan kelas untuk menghasilkan daftar ID node untuk digunakan dengan node_load_multiple()? Apakah ada kasus penggunaan lain untuk itu?

37
user7

EntityFieldQuery menggunakan satu set kait untuk berinteraksi dengan modul penyimpanan bidang, seperti Field SQL Storage, untuk bekerja untuk bidang serta properti simpul lainnya. Jangka panjang, EntityFieldQuery adalah cara yang jauh lebih andal untuk melakukan kueri jenis entitas apa pun, dan dalam beberapa situasi dapat melakukan kueri lintas entitas (lihat field_has_data atau _ list_values_in_use () untuk suatu contoh.

Berikut adalah contoh sederhana menggunakan EntityFieldQuery untuk mendapatkan daftar semua node yang diterbitkan sebelum cap waktu tertentu:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ hasil dari permintaan itu akan terlihat seperti ini:

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

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

        )

)

Anda kemudian dapat menggunakan array itu sebagai input ke node_load_multiple:

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

Saya menemukan masalah pada Drupal tentang menambahkan contoh untuk EntityFieldQuery. Saya telah menggunakannya untuk contoh dan juga untuk menyuarakan pendapat saya tentang panggilan untuk contoh lainnya.

" Apakah kita memerlukan contoh EntityFieldQuery? "

The komentar # 11 menunjukkan penggunaan node_load_multiple() seperti yang terlihat di bawah ini:

$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

Berikut adalah contoh dari salah satu modul tes:

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

Ini memilih node yang bidang tubuhnya dimulai dengan "A". Lihat juga EntityFieldQuery :: execute () tentang cara menggunakan hasil yang dikembalikan.

Ada banyak kasus penggunaan, contoh khasnya adalah entitas query untuk nilai bidang tertentu seperti bidang tubuh seperti yang ditunjukkan pada contoh pertama.

Keuntungannya adalah berfungsi apa pun field_storage yang Anda gunakan. Misalnya, Anda bisa membuat bidang Anda di MongoDB dan EntityQuery akan tetap berfungsi sementara kueri field_data_body secara manual tidak.

8
Berdir

Anda dapat menggunakan EntityFieldQuery kelas untuk query database dan mengambil hasil dalam bentuk daftar yang mirip dengan node_load_multiple() .

Ini dapat dicapai dengan membuat kelas, menerapkan kondisi dan menjalankan kueri, misalnya:

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

Ini akan menghasilkan array seperti:

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

Untuk mengambil ID dari array hasil, Anda dapat menggunakan: current(current($result))->tid.

Ini contoh lebih lanjut:

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

Lihat: Cara menggunakan EntityFieldQuery di Drupal.org untuk penjelasan lebih lanjut.

0
kenorb