EntityFieldQuery vs Db_select ()


Yanıtlar:


11

Bence sözdizimi çok daha basit ve kod daha anlaşılır olacak.

Örneğin , Db_Select ile değere my_typesahip bir alana sahip türü olan düğümler istiyorsanız , yuoll şöyle bir şey yapın:field_foo$val

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

EntityFieldQuery ile çok daha basit:

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

14

Ben prefering ana nedeni olduğunu düşünüyorum EntityFieldQueryüzerinde db_selectşeyler veritabanında saklanır nasıl: Eğer başka bir deyişle, alt düzey yapısı hakkında bilmek zorunda kalmamasıdır. Bu gevşek bağlantıyı geliştirir .


6
Daha da ileri gitmesine rağmen bu doğrudur. Sahada depolama takılabilir. Varsayılan uygulama, alan verilerini veritabanındaki alan başına ayrı bir tabloda depolar, ancak değiştirilebilir, örneğin alan verilerinin MongoDB'de depolanmasına izin veren bir uygulama vardır. Kodunuzun taşınabilir olmasını ve yalnızca belirli site yapılandırmanızda çalışmasını istemiyorsanız, EntityFieldQuery kullanmanız gerekir.
Berdir

3

EntityFieldQuery (EFQ) yalnızca varlık kimliklerini döndürür. Varlık verilerine erişmek istiyorsanız entity_load(), verileri yüklemek arasında, normalde umursadığınız tüm temel şeylerin (alanları yüklemek, diğer modül kancalarını aramak gibi) yapılmasını sağlamak için aramalısınız . . Tabii ki, bu iki SQL sorgusu ve çok fazla yük ile sonuçlanır , ancak bu soyutlama için ödenecek fiyattır.

EFQ sözdiziminin daha açık olması, bence bu daha çok kişisel tercihler meselesi. Ben, örneğin, do not EFQ net olduğunu düşünüyorum. db_select()EFQ ile çalışan bir değiştirme işleminin dönüş değeri testi ve sonraki entity_load()çağrıyı içermesi gerektiğine dikkat edin ve bu, IMHO koduna çok fazla gürültü ekler:

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

Bu nedenle, sorunuzu cevaplayın: Varlıklarınız tam özellikli ise (örn. Eğilebilir, diğer modüller tarafından kullanılabilir vb.) EFQ kullanın ve / veya sözdiziminin daha net olduğunu düşünüyorsunuz. Diğer durumlarda, kullanabilirsiniz db_select().


Tam olarak değil, entity_metadata_wrapper'ı kullanabilir ve yalnızca ihtiyacınız olan şeylere erişebilirsiniz.
Kevin

entity_metadata_wrapper()Burada nasıl yardımcı olduğunu göremiyorum . Varlığı yine de yüklemeniz gerekir.
flaviovs

1

EntityFieldQuery çok daha sınırlıdır db_select(), bu yüzden db_select()yeterince okunabilir ve çok daha esnek olan kullanmamanız için iyi bir nedeniniz olmalıdır (bart cevabına bakın).

Örneğin, alanları getirmek entityFieldQueryiçin innerJoin öğesini kullanın. Herhangi bir sebepten ötürü bir sola katılmanız gerekiyorsa, tuzağa düştünüz ... http://drupal.org/node/1226622


Evet, benim anwser'ımın neden "-1" olduğunu bilmek istiyorum. Evet, entityFieldQuery daha güzel, ama çok güzel, sağlam ve eksiksiz bir API olan db_select'den daha az verimli ... Belirli bir kullanım durumları için çok sınırlı olduğu için kodumdan entityFieldQuery'nin birçoğunu kaldırıyorum, kesinlikle hak ettiğini düşünüyorum dikkat çekti. Neyse.
yann_yinn

1
Bazılarının cevabınızı sevmediğini düşünüyorum, çünkü entityFieldQuery'nin farklı depolama yöntemlerinin üstünde bir soyutlama katmanı olduğunu kabul edemediğinden, bu harika bir özellik. Diyelim ki, MySQL her zaman x / y / z için veritabanı olacağını bildiğimiz birçok site üzerinde çalışıyorum ve ayrıca gerektiğinde daha zayıf db sorguları yazmayı tercih ediyoruz. EntityFieldQuery db_select daha güzel olarak bulamıyorum. Sayfanın üst kısmındaki 2 karşılaştırma neredeyse görsel olarak aynıdır.
Charlie Schliesser

Evet, bu yüzden "bart cevabını gör" yazdım. Bu özel kullanım durumu dışında, db_select daha verimli ve çok daha esnek olacaktır.
yann_yinn

Tamamen katılıyorum.
Charlie Schliesser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.