UNION в хуках Views D7

Главные вкладки

Аватар пользователя reddimonus reddimonus 23 февраля 2019 в 10:41

Добрый день, уважаемые!

Не сталкивался ли кто, как в хуках Views D7 изменить запрос добавив UNION ?

Есть сложный запрос календаря на сайте, который собирает ноды с событиями и выводит все в календарь.
И есть простая табличка с днями рождения. Она заполняется из 1С и к DRUPAL отношения не имеет.

Нужно подмешать данные из таблички к полученным результатам Views и отсортировать.

Получается только Union. При отладке в PhpMyAdmin получается нормально работающий запрос типа

(SELECT .... запрос формируемый Views)
UNION
(SELECT ... запрос из таблички с днями рождения)
ORDER BY ... Сортировка формируемая во Views (но ее можно и переписать в хуке)

Разного рода JOIN примеров и в том числе в API базы данных много, но нужен именно UNION.

Или может кто другое решение подскажет?

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 23 февраля 2019 в 11:16

https://api.drupal.org/api/views/views.api.php/function/hook_views_query...
см. пример для UNION

 /**
   * Test that we can UNION multiple Select queries together. This is
   * semantically equal to UNION DISTINCT, so we don't explicity test that.
   */

  function testUnion() {
    $query_1 = db_select('test', 't')
      ->fields('t', array('name'))
      ->condition('age', array(27, 28), 'IN');

    $query_2 = db_select('test', 't')
      ->fields('t', array('name'))
      ->condition('age', 28);

    $query_1->union($query_2);

    $names = $query_1->execute()->fetchCol();

    // Ensure we only get 2 records.
    $this->assertEqual(count($names), 2, 'UNION correctly discarded duplicates.');

    $this->assertEqual($names[0], 'George', 'First query returned correct name.');
    $this->assertEqual($names[1], 'Ringo', 'Second query returned correct name.');
  }

Получается только Union

Спорное утверждение.

Она заполняется из 1С и к DRUPAL отношения не имеет

А почему дни рождения нельзя записать сохранить в сущности и поля Drupal через Drupal API?

Аватар пользователя reddimonus reddimonus 23 февраля 2019 в 12:01

Спасибо за пример. Посмотрю.

«А почему дни рождения нельзя записать сохранить в сущности и поля Drupal через Drupal API?»
А программисты 1С не хотят. Сказали табличку сделаем и все. API заниматься не будем.

Аватар пользователя reddimonus reddimonus 23 февраля 2019 в 13:19

Я над преобразованием по крону в сущности уже думал.
Но если бы удалось просто таблицы смешать, то это было бы проще.
Пусть пишут в таблицу что хотят, когда хотят - результат сразу.
Если смогу в Хуках в подготовленный Views запрос изменить, то проще будет запросом, если нет - то сущности буду делать.

Там в этих &$query что хук перехватывает тоже разобраться нужно...

И потом, чтобы сделать Union с сортировкой что Views выдает, то нужно первый запрос и второй каждый в скобки брать, иначе сортировка будет только по первому запросу, а второй так присоединится, без сортировки.

В общем не совсем все просто.....

Аватар пользователя reddimonus reddimonus 24 февраля 2019 в 19:03

Положу сюда, может поможет кому.
В общем добавить UNION через хук hook_views_query_alter не удалось.
В этом хуке нет метода UNION.
Как я понял, тут используется для запросов своя Views овская библиотека и немного другие методы (в инете есть немного примеров).

Удалось реализовать UNION через хук hook_views_pre_execute(&$view)
Здесь используется стандартная библиотека Drupal и стандартные методы для работы с бд (UNION тут есть).

Т.к. при объединении разных таблиц с разным числом колонок пришлось дописывать во втором запросе поля отсутствующие в первом, то пришлось пользоваться query->addExpression, т.к. addField не смог вставить поле с константой внутри.

Что характерно.
Т.к. во втором запросе реальные поля и вставляемые, то сначала пробовал одновременно использовать addField для реальных полей и addExpression для вставляемых констант. Ничего не получилось, т.к. сначала вывелся массив addField а потом addExpression, т.е. все перемешалось. Пришлось все загнать в addExpression.

Все получилось, но мою задачу не решило. Я думал календарь воспользуется результатом запроса как несущим всю информацию, а оказалось что там уже дальше в постпроцессах идут уже запросы к сущностям... Ну в общем чем дальше в лес, тем больше дров.

Буду создавать сущности.