Я нашел обходной путь!
Этот код 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 и group by находятся в подзапросе SQL, который не требует ввода $row. Итак, я создал в своем модуле функцию для вывода результатов этого подзапроса и добавил ее в качестве условия в запрос фильтра плагина. Как это:
/**
* Вспомогательная функция, которая строит запрос.
*/
запрос публичной функции () {
если (!пусто($это->значение)) {
// Плагин обработчика соединения представлений: https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21join%21JoinPluginBase.php/group/views_join_handlers/8.2.x
$ конфигурация = [
'тип' => 'ВНУТРЕННИЙ',
'таблица' => 'content_moderation_state_field_revision',
'поле' => 'content_entity_id',
'left_table' => 'node_field_data',
'left_field' => 'нид',
'оператор' => '=',
];
$join = Views::pluginManager('join')->createInstance('standard', $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(); // возвращает наивысший_entity_revision_id
$this->query->addWhere('И', '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 для плагина представлений. Если кто-то знает, пожалуйста, добавьте и этот ответ.
В любом случае, фильтр работает как шарм — я могу отфильтровать представление по опубликованным или черновым узлам или по тому и другому.