Добрый день, уважаемые!
Не сталкивался ли кто, как в хуках Views D7 изменить запрос добавив UNION ?
Есть сложный запрос календаря на сайте, который собирает ноды с событиями и выводит все в календарь.
И есть простая табличка с днями рождения. Она заполняется из 1С и к DRUPAL отношения не имеет.
Нужно подмешать данные из таблички к полученным результатам Views и отсортировать.
Получается только Union. При отладке в PhpMyAdmin получается нормально работающий запрос типа
(SELECT .... запрос формируемый Views)
UNION
(SELECT ... запрос из таблички с днями рождения)
ORDER BY ... Сортировка формируемая во Views (но ее можно и переписать в хуке)
Разного рода JOIN примеров и в том числе в API базы данных много, но нужен именно UNION.
Или может кто другое решение подскажет?
Комментарии
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.');
}
Спорное утверждение.
А почему дни рождения нельзя записать сохранить в сущности и поля Drupal через Drupal API?
Спасибо за пример. Посмотрю.
«А почему дни рождения нельзя записать сохранить в сущности и поля Drupal через Drupal API?»
А программисты 1С не хотят. Сказали табличку сделаем и все. API заниматься не будем.
Куда они выгружают данные - напрямую Вам в таблицу?
Да. Создал им таблицу в БД Drupal а
В принципе из этой таблице Вы можете сами по тому же крону преобразовывать в сущности и удалять уже забранное.
Я бы попросил их сделать сервис хотя на SOAP, тогда Вы сможете сами забирать и сохранять в сущности Drupal. статейка например http://programmist1s.ru/web-servisyi-v-1s/
Я над преобразованием по крону в сущности уже думал.
Но если бы удалось просто таблицы смешать, то это было бы проще.
Пусть пишут в таблицу что хотят, когда хотят - результат сразу.
Если смогу в Хуках в подготовленный Views запрос изменить, то проще будет запросом, если нет - то сущности буду делать.
Там в этих &$query что хук перехватывает тоже разобраться нужно...
И потом, чтобы сделать Union с сортировкой что Views выдает, то нужно первый запрос и второй каждый в скобки брать, иначе сортировка будет только по первому запросу, а второй так присоединится, без сортировки.
В общем не совсем все просто.....
ИМХО целесообразней загрузить в сущности и views тогда не надо альтерить
Так и сделаю.
Оно и далее проще будет. Можно все вывести в любых разрезах.
Всем спасибо. Очень помогли.
Положу сюда, может поможет кому.
В общем добавить UNION через хук hook_views_query_alter не удалось.
В этом хуке нет метода UNION.
Как я понял, тут используется для запросов своя Views овская библиотека и немного другие методы (в инете есть немного примеров).
Удалось реализовать UNION через хук hook_views_pre_execute(&$view)
Здесь используется стандартная библиотека Drupal и стандартные методы для работы с бд (UNION тут есть).
Т.к. при объединении разных таблиц с разным числом колонок пришлось дописывать во втором запросе поля отсутствующие в первом, то пришлось пользоваться query->addExpression, т.к. addField не смог вставить поле с константой внутри.
Что характерно.
Т.к. во втором запросе реальные поля и вставляемые, то сначала пробовал одновременно использовать addField для реальных полей и addExpression для вставляемых констант. Ничего не получилось, т.к. сначала вывелся массив addField а потом addExpression, т.е. все перемешалось. Пришлось все загнать в addExpression.
Все получилось, но мою задачу не решило. Я думал календарь воспользуется результатом запроса как несущим всю информацию, а оказалось что там уже дальше в постпроцессах идут уже запросы к сущностям... Ну в общем чем дальше в лес, тем больше дров.
Буду создавать сущности.