Рейтинг:0

Как использовать функцию sql MAX() в запросе плагина представлений

флаг gb

Я создаю настраиваемый фильтр представлений для пользовательского поля представлений. Следующий SQL выполнит фильтр, который я ищу:

выберите nid, moderation_state, content_entity_id, MAX (content_entity_revision_id) 
  из внутреннего соединения узла content_moderation_state_field_revision на nid = content_entity_id 
    где content_entity_id = 59 группа по content_entity_id

В моем php-файле плагина фильтра представлений у меня есть следующий код для добавления вышеуказанного sql к запросу фильтра:

/**
   * Вспомогательная функция, которая строит запрос.
   */
  запрос публичной функции () {
    если (!пусто($это->значение)) {
      $ конфигурация = [
        'таблица' => '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->addExpression('MAX(content_moderation_state_field_revision.content_entity_revision_id)');
      $this->query->groupBy("content_moderation_state_field_revision.content_entity_id");
      $this->query->addWhere('AND', 'content_moderation_state_field_revision', $this->value, 'IN');
    }
  }

Эта ошибка возникает при выполнении запроса:

Ошибка: вызов неопределенного метода Drupal\views\Plugin\views\query\Sql::addExpression()

Пока добавитьВыражение() часть API основной базы данных он не поддерживается в плагине запросов представлений sql API,

Итак, мне нужен обходной путь, чтобы добавить выражение MAX() в запрос. Любые предложения о том, как это сделать?

Рейтинг:0
флаг gb

Я нашел обходной путь!

Этот код 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 для плагина представлений. Если кто-то знает, пожалуйста, добавьте и этот ответ.

В любом случае, фильтр работает как шарм — я могу отфильтровать представление по опубликованным или черновым узлам или по тому и другому.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.