ฉันพบวิธีแก้ปัญหาแล้ว!
รหัส SQL นี้ทำให้ฉันได้รับสิ่งที่ฉันกำลังมองหา:
เลือก * จาก content_moderation_state_field_revision โดยที่ (content_entity_id, content_entity_revision_id) ใน
(
เลือก content_entity_id, MAX(content_entity_revision_id) จากกลุ่ม content_moderation_state_field_revision ตาม content_entity_id
)
และ moderation_state = 'ฉบับร่าง'
โปรดทราบว่า MAX และการจัดกลุ่มตามฟังก์ชันทั้งหมดอยู่ในเคียวรีย่อยของ SQL ซึ่งไม่ต้องการการป้อน $row ดังนั้น ฉันจึงสร้างฟังก์ชันในโมดูลของฉันเพื่อแสดงผลลัพธ์ของเคียวรีย่อยนั้น และเพิ่มเป็นเงื่อนไขในเคียวรีตัวกรองปลั๊กอิน แบบนี้:
/**
* ฟังก์ชันตัวช่วยที่สร้างแบบสอบถาม
*/
แบบสอบถามฟังก์ชันสาธารณะ () {
ถ้า (!empty($this->value)) {
// ดูปลั๊กอินตัวจัดการเข้าร่วม: https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21join%21JoinPluginBase.php/group/views_join_handlers/8.2.x
$การกำหนดค่า = [
'type' => 'ภายใน',
'table' => 'content_moderation_state_field_revision',
'field' => 'content_entity_id',
'left_table' => 'node_field_data',
'left_field' => 'นิด',
'ตัวดำเนินการ' => '=',
];
$join = Views::pluginManager('join')->createInstance('มาตรฐาน', $configuration);
$this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');
$this->query->addGroupBy("content_moderation_state_field_revision.content_entity_id");
$revision_ids = sbn_moderation_state_sql_subquery(); // คืนค่า maximum_entity_revision_id
$this->query->addWhere('AND', 'content_entity_revision_id', $revision_ids, 'IN');
$this->query->addWhere('AND', 'moderation_state', $this->value, 'IN');
}
}
ฉันยังมีส่วนคำสั่ง addGroupBy แต่ฉันไม่คิดว่าจำเป็นเพราะฟังก์ชัน MAX อยู่ในแบบสอบถามย่อยซึ่งดูแลการส่งคืน content_entity_revision_id สูงสุดสำหรับแต่ละโหนด
แน่นอน ฉันยังไม่ทราบไวยากรณ์ที่ถูกต้องสำหรับการเพิ่มฟังก์ชัน MAX() ในไวยากรณ์ของปลั๊กอินเคียวรี sql api ของมุมมอง ถ้าใครรู้โปรดเพิ่มคำตอบนั้นด้วย
อย่างไรก็ตาม ตัวกรองทำงานได้อย่างมีเสน่ห์ -- ฉันสามารถกรองมุมมองตามโหนดที่เผยแพร่หรือแบบร่าง หรือทั้งสองอย่าง