Dapatkan hanya beberapa bidang dengan EntityFieldQuery?

19

Drupal 7 memiliki sistem kueri mirip ORM yang sangat menjanjikan dengan EntityFieldQuery.

Saat ini, saya mengerti bagaimana memilih node, tetapi hasilnya tidak mengandung informasi spesifik, seperti fil, yang saya cari.

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

Jadi kita perlu memuat seluruh data node, jika kita hanya ingin mendapatkan nilai dari satu bidang, misalnya 'field_date' dalam contoh saat ini.

$nodes = entity_load('node', array_keys($entities['node']));

Jika ada cara untuk mendapatkan nilai bidang, alih-alih memuat data lengkap semua node, karena memicu beberapa kelebihan memori.

$nodesFieldDates = ???
Fedir RYKHTIK
sumber

Jawaban:

10

Pertanyaan bagus!

EntityFieldQuery adalah hal yang benar-benar bagus, tetapi jika Anda benar - benar ingin serius, Anda harus mengganti kelas dalam modul khusus dan menambahkan perilaku apa pun yang perlu Anda lakukan di sana.

Saya tidak tahu maksud pasti Anda, tetapi saya telah merujuk diri saya ke artikel ini pada subjek di masa lalu. Penghargaan untuk Neil Hastings untuk penulisan yang ditulis dengan baik ini.

Carilah contoh kode sedikit ke dalam artikel untuk contoh bagus dari pengesetan.

Semoga itu bisa membantu, selamat coding!

stefgosselin
sumber
Ok aku paham ! Jadi, mungkin, mungkin untuk mendefinisikan kembali metode "EntityFieldQuery" "buildQuery", untuk mengganti bidang yang dihasilkan. Mungkin ini bisa berhasil.
Fedir RYKHTIK
11

Saya menemukan jawabannya untuk ini! Modul Apache Solr memperluas kelas EntityFieldQuery untuk mewujudkannya. Itu menambahkan metode baru yang disebut addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$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')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Jika Anda tidak menginstal Apache Solr cukup salin kode untuk memperluas kelas itu.

mikeytown2
sumber
Dibuat kotak pasir untuk ini karena modul Apache Solr memiliki beberapa kekurangan drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Terbarui jawaban ini hanya untuk modul (saat ini kotak pasir) yang dibuat oleh mikeytown2 (terima kasih!)
Oliver Coleman
Tautan dalam jawaban sepertinya tidak berfungsi. Dikatakan "Anda harus masuk atau mendaftar sebelum melanjutkan."
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/... Memperbarui tautannya
mikeytown2
0

Siapa pun yang masih ingin mendapatkan Fields dari EFQ lihatlah modul EFQ Extra Fields .

Peringatan: Modul ini menyalahgunakan EntityFieldQuery untuk mengembalikan data dari database Anda. Itu tidak bekerja dengan entitas atau modul apa pun yang dibangun di atasnya.

Ini memungkinkan Anda untuk menggunakan addField dalam objek EntityFieldQueryExtraFields (memperluas objek EntityFieldQuery). Awalnya EntityFieldQuery hanya memberi Anda kembali id ​​entitas, bundel, dan tipe entitas. Modul ini menambahkan lapisan tambahan di atasnya tanpa melakukan tambahan entity_loads! Penting jika Anda ingin bekerja dengan sejumlah besar data dan Anda ingin mengurangi kueri sql. Karena EFQ sudah menanyakan basis data untuk informasi ini, mengapa tidak mengubah kueri itu untuk juga memberi Anda beberapa bidang tambahan. Ini berarti bahwa tidak satu permintaan tambahan akan dilakukan untuk mendapatkan data itu.

Sebuah kata peringatan, jika Anda mengandalkan beberapa pemformatan / pemuatan pasca yang terjadi di entity_load atau fungsi serupa, modul ini tidak akan menangani itu. Anda harus memastikan validitas data yang diambil sendiri.

Contoh

Mengambil judul simpul

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> mengeksekusi ();
Kemungkinan kombinasi:
addExtraField ($ field_name, $ kolom, $ column_alias = NULL, $ table = NULL)

field_name
Tentukan dari bidang mana bidang tambahan harus datang. Jika berasal dari tabel dasar, biarkan kosong dan isi argumen tabel

kolom
Tentukan nama kolom,

kolom_alias
Tentukan alias kolom,

meja
Secara opsional, tambahkan sesuatu seperti simpul atau pengguna di sini (tabel dasar),
Tenken
sumber
Saya sudah mencoba kedua modul ini (EFQ Extra Fields) dan modul (saat ini kotak pasir) oleh mikeytown2 dan yang terakhir tampak jauh lebih baik (lebih baik untuk digunakan, keluaran yang lebih masuk akal) dan juga tampaknya dipertahankan jauh lebih baik daripada yang sebelumnya. Modul sandbox mikeytown2 ada di drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman