it-swarm.asia

هل تحصل على بعض الحقول فقط مع EntityFieldQuery؟

لدى Drupal 7 نظام استعلامات واعد جدًا يشبه ORM مع EntityFieldQuery.

حاليًا ، أفهم كيفية تحديد العقد ، ولكن النتيجة لا تحتوي على أي معلومات محددة ، مثل الحقول التي أبحث عنها.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

لذلك نحتاج إلى تحميل بيانات العقد بالكامل ، إذا أردنا الحصول على قيم حقل واحد فقط ، على سبيل المثال "field_date" في المثال الحالي.

$nodes = entity_load('node', array_keys($entities['node']));

إذا كانت هناك طريقة للحصول على قيمة الحقول ، فبدلاً من ذلك ، يمكنك تحميل بيانات كاملة لجميع العقد ، حيث أنها تثير بعض الذاكرة الزائدة.

$nodesFieldDates = ???
18
Fedir RYKHTIK

سؤال عظيم!

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

أنا لا أعرف نواياك بالضبط ، لكني أشرت إلى هذه المقالة حول هذا الموضوع في الماضي. ائتمانات لنيل هاستينغز لهذه الكتابة المكتوبة بشكل جيد.

ابحث عن أمثلة التعليمات البرمجية قليلاً في المقالة للحصول على أمثلة لطيفة للتجاوز.

آمل أن يساعد ، الترميز سعيدة!

10
stefgosselin

لقد وجدت الجواب لهذا! الوحدة النمطية Apache Solr توسع فئة EntityFieldQuery لتحقيق ذلك. يضيف طريقة جديدة تسمى addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

إذا لم يكن Apache Solr مثبتًا لديك ، فما عليك سوى نسخ الرمز لتوسيع هذا الفصل الدراسي.

11
mikeytown2

لست بحاجة إلى تجاوز أي شيء أو تمديد الفصل. تحتاج فقط إلى استخدام field_attach_load() لإرفاق الحقل الذي تريده بالنتائج من EntityFieldQuery .

انظر أيضًا تحميل حقل واحد فقط من كيان أو Node in Drupal 7 ، مقال جيد يحتوي على أمثلة حول كيفية القيام بذلك .

8
jyee

أي شخص لا يزال يريد الحصول على الحقول من EFQ ألق نظرة على EFQ Extra Fields الوحدة النمطية.

تحذير: إساءة استخدام هذه الوحدة النمطية EntityFieldQuery لإرجاع البيانات من قاعدة البيانات الخاصة بك. لا يعمل مع الكيانات أو أي وحدات تعتمد عليها.

يسمح لك باستخدام addField داخل كائن EntityFieldQueryExtraFields (يمتد كائنات EntityFieldQuery). مبدئيًا ، يمنحك EntityFieldQuery فقط معرف الكيان وحزمة ونوع الكيان. تضيف هذه الوحدة طبقة إضافية فوق ذلك دون القيام ببعض حمل الكيانات الإضافية! مهم إذا كنت ترغب في العمل بكميات هائلة من البيانات وترغب في تقليل استعلامات sql. نظرًا لأن EFQ تستعلم بالفعل من قاعدة البيانات للحصول على هذه المعلومات ، فلماذا لا تغير هذا الاستعلام لتعطيك أيضًا بعض الحقول الإضافية. هذا يعني أنه لن يتم تنفيذ استعلام إضافي واحد للحصول على تلك البيانات.

كلمة تحذير ، إذا كنت تعتمد على بعض عمليات ما بعد التنسيق/ما بعد التحميل التي تحدث في تحميل_كيان أو وظائف مماثلة ، فلن تهتم هذه الوحدة بذلك. يجب عليك التأكد من صحة البيانات المستردة بأنفسكم.

 مثال 
 
 جلب عنوان العقدة 
 
 $ query = new EntityFieldQueryExtraFields () ؛ 
 $ result = $ query-> كيانكونديتيون ("كيان_نوع" ، "عقدة") 
 -> propertyCondition ('type'، 'my_bundle_type') 
 -> propertyCondition ('status'، 1) 
 -> addExtraField ('field_myfield'، value '، value') 
 -> addExtraField ('field_mynodereffield'، nid '، nid') 
 -> addExtraField (''، 'title'، 'title'، 'node') 
 -> fieldCondition ('field_myfield'، 'value'، 'some_value_to_filter_on'، '=') 
 -> تنفيذ ()؛ 
 تركيبات ممكنة: 
 addExtraField ($ field_name، $ العمود، $ column_alias = NULL، $ table = NULL) 
 
 field_name 
 حدد من أي حقل يجب أن يأتي الحقل الإضافي. إذا كان من جدول أساسي ، فاتركه فارغًا واملأ وسيطة الجدول 
 
 العمود 
 حدد اسم العمود ، 
 
 row_alias 
 حدد الاسم المستعار للعمود ، 
 
 الجدول 
 اختياريًا ، أضف شيئًا مثل العقدة أو المستخدم هنا (الجدول الأساسي) ، 
0
tenken