EntityFieldQuery ภายในเข้าร่วม


21

ฉันต้องการเรียกใช้แบบสอบถามโดยใช้วัตถุ EntityFieldQuery ฉันต้องการค่าจากทั้งโหนดและตาราง node_access ดังนั้นฉันต้องใช้ INNER JOIN จากเอกสารที่ต้องทำฉันไม่สามารถทราบได้ว่าเป็นไปได้อย่างไร

นี่คือสิ่งที่ฉันมี -

$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();

1
แม้ว่าจะไม่สามารถทำได้ทันทีใน Drupal 7 แต่สามารถทำได้ใน Drupal 8 (ยังไม่ได้เผยแพร่ในขณะที่เขียนบทความนี้) ดูคิวรีของเอนทิตีฟิลด์ได้รับการสนับสนุนสำหรับรายละเอียด (รวมถึงตัวอย่าง)
colan

ใน Drupal 8 เงื่อนไขทั้งหมดเป็นเช่นนั้น (-> condition ()) ตัวอย่างของ EFQ ใน D8: $ result = \ Drupal :: entityQuery ('node') -> condition ('type', array ('entity_a', 'เอนทิตี _'), 'IN') -> condition ('status' , NODE_PUBLISHED) -> condition ('field_myfield.value', '5', '=') -> execute (); ใน Drupal 8 EFQ collumn ถูกกำหนดโดยตรงในฟิลด์ชื่อโดย field_name.value หรือ field_name.target_id ใน drupal 7 คือ->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

คำตอบ:


30

คุณไม่สามารถเพิ่มการรวมพิเศษลงใน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');
}

วิธีอื่นที่จะทำคือการ subclass EntityFieldQueryเองและเพิ่มการเข้าร่วม แต่ฉันคิดว่าวิธีการข้างต้นนั้นง่ายกว่าในกรณีนี้


มีวิธีที่ดีกว่าที่จะทำในฟังก์ชั่นเดียวหรือไม่? แม้ว่าจะไม่ใช่EntityFieldQuery
Allan Thomas

2
ไม่ใช่วิธีเดียวที่จะสร้างคิวรีแบบแมนนวลโดยใช้db_selectจากนั้นคุณสามารถควบคุมได้มากเท่าที่คุณต้องการ
Clive

ฉันจะไปกับที่ ขอบคุณ
อัลลันโทมัส

@ ไคลฟ์ ... โอ้คำตอบนี้น่าสนใจจริงๆ ชอบมัน. : P
tenken

2
@Michiel EntityFieldQueryไม่ทำการแคชใด ๆ เพียงแค่ล้อมรอบSelectQueryและเพิ่มวิธีการบางอย่างสำหรับเอนทิตี วิธีการพิเศษเหล่านั้นมีผลต่อประสิทธิภาพที่ลดลงเล็กน้อย (เล็กน้อยมาก) ซึ่งคุณจะได้รับเมื่อเทียบกับการใช้งานทั่วไปSelectQuery
Clive

3

หากคุณกำลังใช้คุณสมบัติที่กำหนดเองกับตารางของคุณเองวิธีการแท็กจะไม่ทำงาน คุณต้องใช้แบบสอบถามย่อยแทน:

$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 เกี่ยวกับแบบสอบถามย่อยอย่างไร สำหรับรายละเอียด


ทางออกที่ยอดเยี่ยมสำหรับกรณีเช่นของฉันกับตารางที่กำหนดเอง เยี่ยมมาก!
Ignacio Segura Postigo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.