لدى 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 = ???
سؤال عظيم!
EntityFieldQuery
هي أشياء جيدة حقًا ، ولكن إذا كنت حقًا تريد أن تصبح جادًا ، فعليك تجاوز فئة في وحدة مخصصة وإضافة أي سلوك تحتاج إلى القيام به هناك.
أنا لا أعرف نواياك بالضبط ، لكني أشرت إلى هذه المقالة حول هذا الموضوع في الماضي. ائتمانات لنيل هاستينغز لهذه الكتابة المكتوبة بشكل جيد.
ابحث عن أمثلة التعليمات البرمجية قليلاً في المقالة للحصول على أمثلة لطيفة للتجاوز.
آمل أن يساعد ، الترميز سعيدة!
لقد وجدت الجواب لهذا! الوحدة النمطية 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 مثبتًا لديك ، فما عليك سوى نسخ الرمز لتوسيع هذا الفصل الدراسي.
لست بحاجة إلى تجاوز أي شيء أو تمديد الفصل. تحتاج فقط إلى استخدام field_attach_load()
لإرفاق الحقل الذي تريده بالنتائج من EntityFieldQuery
.
انظر أيضًا تحميل حقل واحد فقط من كيان أو Node in Drupal 7 ، مقال جيد يحتوي على أمثلة حول كيفية القيام بذلك .
أي شخص لا يزال يريد الحصول على الحقول من 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 حدد الاسم المستعار للعمود ، الجدول اختياريًا ، أضف شيئًا مثل العقدة أو المستخدم هنا (الجدول الأساسي) ،