Apa penggunaan EntityFieldQuery yang tepat?

37

Di Drupal 7, dokumentasi API untuk node_load_multiple()menentukan penggunaan $conditionsparameter telah ditinggalkan karena penggunaan EntityFieldQuery. Bagaimana cara menggunakan kelas untuk menghasilkan daftar ID node untuk digunakan node_load_multiple()? Apakah ada kasus penggunaan lain untuk itu?

Andre Baumeier
sumber

Jawaban:

36

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 menanyakan segala jenis entitas, dan dalam beberapa situasi dapat melakukan kueri lintas entitas (lihat field_has_data atau _list_values_in_use () sebagai 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']));
Mikey P
sumber
3
field_has_data adalah contoh imo yang lebih bagus daripada _list_values_in_use
15

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

" Apakah kita memerlukan contoh EntityFieldQuery? "

The komentar # 11 penggunaan pertunjukan dari 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');
electblake
sumber
2
Perhatian, metode fieldOrderBy akan meninggalkan semua node yang memiliki bidang terkait kosong. Yang membingungkan karena ini seharusnya hanya menyortir dan tidak memfilter (Anda akan mengharapkan node dengan bidang kosong berada di atas atau bawah kumpulan hasil). Info lebih lanjut dan semoga perbaikannya dapat ditemukan di sini drupal.org/node/1611438 dan di sini drupal.org/node/1662942
Mario Awad
9

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.

Berdir
sumber
0

Anda bisa menggunakan kelas EntityFieldQuery untuk query database dan mengambil hasilnya dalam bentuk daftar yang mirip 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.

kenorb
sumber