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.
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.
Jawaban:
Saya pikir intinya adalah bahwa sintaksinya jauh lebih sederhana, dan kodenya akan lebih dimengerti.
Misalnya, jika Anda ingin node dengan tipe my_type
yang memiliki bidang bernama field_foo
dengan 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();
Saya pikir alasan utama yang EntityFieldQuery
lebih disukai db_select
adalah karena Anda tidak perlu tahu tentang struktur tingkat bawah, dengan kata lain: bagaimana barang disimpan dalam database. Ini meningkatkan kopling longgar .
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()
.
entity_metadata_wrapper()
membantu di sini. Anda masih perlu memuat entitas.
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, entityFieldQuery
gunakan innerJoin untuk mengambil bidang. Jika Anda memerlukan kidal untuk alasan apa pun, Anda terjebak ...
http://drupal.org/node/1226622