لماذا يجب علي استخدام EntityFieldQuery عندما يمكنني القيام بنفس العمل مع Db_select () لجلب القيمة.
سيكون من الأفضل أن يتمكن شخص ما من تقديم مثال وليس فقط رابط.
أعتقد أن النقطة هي أن البنية أبسط بكثير ، وسيكون الرمز أكثر قابلية للفهم.
على سبيل المثال ، إذا كنت تريد عقدًا من النوع my_type
التي لها حقل باسم field_foo
بقيمة $val
، مع Db_Select ، يمكنك القيام بشيء مثل:
$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:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
أعتقد أن السبب الرئيسي في تفضيل EntityFieldQuery
على db_select
هو أنه ليس عليك معرفة البنية ذات المستوى الأدنى ، وبعبارة أخرى: كيف يتم تخزين الأشياء في قاعدة البيانات. هذا يحسن اقتران فضفاض .
ستعرض EntityFieldQuery (EFQ) معرفات الكيانات فقط. إذا كنت تريد الوصول إلى بيانات الكيانات ، فسيتعين عليك استدعاء entity_load()
، والتي من بين تحميل البيانات ، ستتأكد من أن جميع الأشياء الأساسية التي لا تهتم بها عادةً (مثل حقول التحميل ، والاتصال بغيرها مصنوعة وحدات السنانير وما إلى ذلك). بالطبع ، هذه النتيجة اثنين استعلامات SQL والكثير من النفقات العامة ، ولكن هذا هو الثمن الذي يجب دفعه مقابل التجريد.
بالنسبة لكون صيغة EFQ أكثر وضوحًا ، أعتقد أنها مسألة تفضيلات شخصية. أنا ، على سبيل المثال ، هل لا أعتقد أن EFQ أكثر وضوحًا. لاحظ أن الاستبدال db_select()
الاستعاضة عن EFQ يجب أن يتضمن اختبار القيمة المرجعة واستدعاء entity_load()
اللاحق ، وهذا يضيف الكثير من الضوضاء إلى الرمز ، 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();
}
لذا ، للإجابة على سؤالك: استخدم EFQ إذا كانت الكيانات الخاصة بك كاملة المواصفات (على سبيل المثال ، قابلة للحقل ، يمكن استخدامها من قبل وحدات أخرى ، وما إلى ذلك) و/أو تعتقد أن بناء الجملة أكثر وضوحًا. في حالات أخرى ، قد يستخدم الاستخدام db_select()
.
EntityFieldQuery محدودة أكثر بكثير من db_select()
، لذلك يجب أن يكون لديك سبب وجيه حقًا لعدم استخدام db_select()
(انظر إجابة بارت) ، وهي قابلة للقراءة بشكل كافٍ وأكثر مرونة بكثير .
على سبيل المثال ، entityFieldQuery
استخدم innerJoin لجلب الحقول. إذا كنت بحاجة إلى leftJoin لأي سبب من الأسباب ، فأنت محاصر ... http://drupal.org/node/1226622