it-swarm.asia

EntityFieldQuery الانضمام الداخلي

أود تشغيل استعلام باستخدام كائن EntityFieldQuery. أحتاج إلى قيمة من كل من العقدة وجدول node_access لذا سأحتاج إلى استخدام INNER JOIN. من وثائق d.o لا أستطيع معرفة كيف يمكن ذلك.

إليكم ما لدي -

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();
20
Allan Thomas

لا يمكنك إضافة روابط إضافية إلى EntityFieldQuery مباشرة (غير مدعوم) ، ولكن يمكنك إضافة علامة إلى الاستعلام وتنفيذ hook_query_TAG_alter() ، وإضافة الصلة يدوياً عند تحويل الاستعلام إلى استعلام db قياسي.

لم يتم اختبار هذا ولكن من المحتمل أن ينقلك إلى أقصى حد هناك:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

ثم وظيفة تغيير الاستعلام:

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

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

30
Clive

إذا كنت تستخدم خصائص مخصصة مع الجداول الخاصة بك ، فلن تعمل طريقة العلامات. تحتاج إلى استخدام الاستعلامات الفرعية بدلاً من ذلك:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

انظر هل تريد الانضمام إلى EntityFieldQuery ، ماذا عن استعلام فرعي؟ للحصول على التفاصيل.

3
colan