Bagaimana cara memuat simpul dengan nilai bidang?

19

Saya ingin memuat simpul tertentu. Saya tidak tahu id dari node tetapi saya tahu bahwa ia memiliki bidang hash tertentu yang unik dan saya tahu hash itu.

Saya ingin memuat simpul melalui bidang hash. Bagaimana saya bisa melakukan itu?

Andrew
sumber

Jawaban:

14

Anda dapat mencapai dengan menggunakan EntityFieldQuery.

Untuk D8 EntityFieldQuery telah ditulis ulang.

Drupal 8:

$query = \Drupal::entityQuery('entity_test');
$default_langcode_group = $query->andConditionGroup()
  ->condition('user_id', $properties[$default_langcode]['user_id'], '=', $default_langcode)
  ->condition('name', $properties[$default_langcode]['name'], '=', $default_langcode);
$langcode_group = $query->andConditionGroup()
  ->condition('name', $properties[$langcode]['name'], '=', $langcode)
  ->condition("$this->field_name.value", $field_value, '=', $langcode);
$result = $query
  ->condition('langcode', $default_langcode)
  ->condition($default_langcode_group)
  ->condition($langcode_group)
  ->sort('name', 'ASC', $default_langcode)
  ->execute();

Bagaimana cara mengambil nilai bidang entitas?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('changed', REQUEST_TIME, '<')
    ->condition('title', 'cat', 'CONTAINS')
    ->condition('field_tags.entity.name', 'cats');

$nids = $query->execute();
DRUPWAY
sumber
Jadi jika saya memahami ini dengan benar, ini akan mengembalikan banyak id node (atau satu id, atau tidak sama sekali, tergantung pada kondisinya), tetapi saya masih harus menggunakan Node::untuk memuat kata node, benar?
Andrew
ya kamu benar.
DRUPWAY
31

Cara tercepat untuk memuat simpul tertentu berdasarkan nilai bidang adalah dengan menggunakan metode ini loadByProperties().

Anda menentukan satu atau lebih nilai bidang dan dikembalikan adalah array yang berisi node yang cocok dengan nilai bidang:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);

Biasanya Anda mengulang simpul. Dalam kasus Anda, Anda mencari satu simpul tertentu. Satu node juga dikembalikan dalam array, jadi terapkan reset()dan ini mengembalikan node atau NULL jika tidak ada yang ditemukan:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
sumber
1
Saya berasumsi dalam kasus saya, saya tidak akan memerlukan bagian kedua dari kode ( $node = reset...) karena hash itu sendiri unik.
Andrew
3
Node tunggal masih dalam array. Anda bisa menggunakan $ node = $ node [0], tetapi kemudian Anda harus memeriksa apakah ada simpul untuk menghindari peringatan di log kesalahan. reset () lebih baik karena secara diam-diam mengembalikan NULL.
4k4
Tidak yakin mengapa semua upvotes untuk ini; pertanyaan aslinya adalah memuat sebuah simpul berdasarkan nilai field. Properti (seperti Judul) bukan bidang.
liquidcms
@liquidcms, judul adalah bidang simpul dan Anda dapat menggunakan bidang simpul lainnya. Bidang Drupal BTW memiliki satu atau beberapa properti. Jika itu adalah satu properti, Drupal paling sering menggunakan nilai nama properti. Jadi untuk sebagian besar bidang kedua istilah tersebut dapat dipertukarkan.
4k4
Lihat contoh ini untuk menanyakan dua bidang yang berbeda drupal.stackexchange.com/questions/250306/...
4k4