Değeri getirmek için Db_select () ile aynı işi yapabildiğimde neden EntityFieldQuery kullanmalıyım .
Birisinin sadece bir bağlantı değil, bir örnek vermesi daha iyi olur.
Değeri getirmek için Db_select () ile aynı işi yapabildiğimde neden EntityFieldQuery kullanmalıyım .
Birisinin sadece bir bağlantı değil, bir örnek vermesi daha iyi olur.
Yanıtlar:
Bence sözdizimi çok daha basit ve kod daha anlaşılır olacak.
Örneğin , Db_Select ile değere my_type
sahip 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();
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 .
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()
.
entity_metadata_wrapper()
Burada nasıl yardımcı olduğunu göremiyorum . Varlığı yine de yüklemeniz gerekir.
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 entityFieldQuery
iç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