it-swarm.asia

EntityFieldQuery ضد Db_select ()

لماذا يجب علي استخدام EntityFieldQuery عندما يمكنني القيام بنفس العمل مع Db_select () لجلب القيمة.

سيكون من الأفضل أن يتمكن شخص ما من تقديم مثال وليس فقط رابط.

18
j2r

أعتقد أن النقطة هي أن البنية أبسط بكثير ، وسيكون الرمز أكثر قابلية للفهم.

على سبيل المثال ، إذا كنت تريد عقدًا من النوع 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();
11
IcanDivideBy0

أعتقد أن السبب الرئيسي في تفضيل EntityFieldQuery على db_select هو أنه ليس عليك معرفة البنية ذات المستوى الأدنى ، وبعبارة أخرى: كيف يتم تخزين الأشياء في قاعدة البيانات. هذا يحسن اقتران فضفاض .

14
Bart

ستعرض 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().

3
flaviovs

EntityFieldQuery محدودة أكثر بكثير من db_select() ، لذلك يجب أن يكون لديك سبب وجيه حقًا لعدم استخدام db_select() (انظر إجابة بارت) ، وهي قابلة للقراءة بشكل كافٍ وأكثر مرونة بكثير .

على سبيل المثال ، entityFieldQuery استخدم innerJoin لجلب الحقول. إذا كنت بحاجة إلى leftJoin لأي سبب من الأسباب ، فأنت محاصر ... http://drupal.org/node/1226622

1
yann_yinn