EntityFieldQuery vs Db_select ()

19

Mengapa saya harus menggunakan EntityFieldQuery ketika saya bisa melakukan pekerjaan yang sama dengan Db_select () untuk mengambil nilai.

Akan lebih baik jika seseorang bisa memberikan contoh, bukan hanya tautan.

j2r
sumber

Jawaban:

11

Saya pikir intinya adalah bahwa sintaksinya jauh lebih sederhana, dan kodenya akan lebih dimengerti.

Misalnya, jika Anda ingin node dengan tipe my_typeyang memiliki bidang bernama field_foodengan nilai $val, dengan Db_Select, yuoll melakukan sesuatu seperti:

$nids = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
  ->condition('n.type', 'my_type')
  ->condition('foo.field_foo_value', $val)
  ->execute()->fetchCol();

Yang jauh lebih sederhana dengan EntityFieldQuery:

$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
IcanDivideBy0
sumber
14

Saya pikir alasan utama yang EntityFieldQuerylebih disukai db_selectadalah karena Anda tidak perlu tahu tentang struktur tingkat bawah, dengan kata lain: bagaimana barang disimpan dalam database. Ini meningkatkan kopling longgar .

Bart
sumber
6
Ini benar, meskipun lebih jauh. Penyimpanan bidang bisa dicolokkan. Implementasi default menyimpan data lapangan dalam tabel terpisah per bidang dalam database, tetapi bisa diganti, misalnya ada implementasi yang memungkinkan untuk menyimpan data lapangan dalam MongoDB. Jika Anda ingin kode Anda portabel dan tidak hanya berfungsi pada konfigurasi situs spesifik Anda, Anda harus menggunakan EntityFieldQuery.
Berdir
3

EntityFieldQuery (EFQ) hanya akan mengembalikan ID entitas. Jika Anda ingin mengakses data entitas, Anda harus menelepon entity_load(), yang, di antara memuat data, akan memastikan bahwa semua hal mendasar yang biasanya tidak Anda pedulikan (seperti memuat bidang, memanggil kait modul lain, dll.) Dibuat . Tentu saja, ini menghasilkan dua query SQL dan banyak overhead, tetapi ini adalah harga yang harus dibayar untuk abstraksi.

Adapun sintaks EFQ menjadi lebih jelas, saya pikir ini lebih merupakan pertanyaan tentang preferensi pribadi. Saya, misalnya, tidak berpikir bahwa EFQ lebih jelas. Perhatikan bahwa db_select()pengganti yang berfungsi dengan EFQ harus menyertakan tes nilai balik dan entity_load()panggilan berikutnya , dan ini menambah banyak kebisingan pada kode, IMHO:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
if (!empty($entities['node'])) {
  $nodes = entity_load('node', array_keys($entities['node']));
} else {
  $nodes = array();
}

Jadi, jawablah pertanyaan Anda: gunakan EFQ jika entitas Anda berfitur lengkap (mis. Dapat fieldable, dapat digunakan oleh modul lain, dll.) Dan / atau Anda berpikir bahwa sintaksnya lebih jelas. Jika ada kasus lain, gunakan boleh pakai db_select().

flaviovs
sumber
Tidak juga, Anda dapat menggunakan entitas_metadata_wrapper dan hanya mengakses apa yang Anda butuhkan.
Kevin
Saya gagal melihat bagaimana entity_metadata_wrapper()membantu di sini. Anda masih perlu memuat entitas.
flaviovs
1

EntityFieldQuery jauh lebih terbatas daripada db_select(), jadi Anda harus memiliki alasan yang sangat bagus untuk tidak menggunakan db_select()(lihat jawaban bart), yang cukup mudah dibaca dan jauh lebih fleksibel.

Misalnya, entityFieldQuerygunakan innerJoin untuk mengambil bidang. Jika Anda memerlukan kidal untuk alasan apa pun, Anda terjebak ... http://drupal.org/node/1226622

yann_yinn
sumber
Yah, saya ingin tahu mengapa server saya memiliki "-1". yeah, entityFieldQuery lebih cantik, tetapi kurang efisien daripada db_select yang sangat bagus, kuat, dan lengkap API ... Saya menghapus banyak entitasFieldQuery dari kode saya karena terlalu terbatas untuk kasus penggunaan tertentu, pikir itu pasti layak untuk menjadi ditunjukkan. Bagaimanapun.
yann_yinn
1
Saya pikir beberapa tidak suka jawaban Anda karena gagal untuk mengakui bagaimana entitasFieldQuery adalah lapisan abstraksi di atas metode penyimpanan yang berbeda, yang merupakan fitur keren. Saya bekerja di banyak situs di mana kita tahu bahwa, katakanlah, MySQL akan selalu menjadi basis data untuk x / y / z dan kami juga lebih suka menulis kueri db yang lebih ramping ketika kami membutuhkannya. Saya tidak menemukan entityFieldQuery lebih cantik dari pada db_select. 2 perbandingan di bagian atas halaman hampir identik secara visual.
Charlie Schliesser
ya, itu sebabnya saya menulis "lihat jawaban bart". Kecuali untuk kasus penggunaan khusus ini, db_select akan lebih efisien dan jauh lebih fleksibel.
yann_yinn
Saya sangat setuju.
Charlie Schliesser