Редактировать запрос вьюшки.

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

Аватар пользователя AlekseyArh AlekseyArh 29 ноября 2017 в 15:06

Добрый день. Через админку накликано представление, оно формирует SQL запрос.
Есть ли способ подменить этот запрос на свой? Нужно брать данные из другой таблицы.

Лучший ответ

Аватар пользователя AlekseyArh AlekseyArh 3 декабря 2017 в 10:42

В общем hook_views_query_alter и прочие view api не подходят.
Эти хуки кстати надо писать не в module_name.module, а в module_name.views_execution.inc
В принципе базовую таблицу можно поменять из хука hook_views_query_alter вот так:

<?php
$views
->storage->set('base_table''ваша_таблица');
?>

Но в запросе будет ошибка, потому что вместе с таблице поменяется её alias, по которому работают выборка, условия и join.
Поменять alias в этом же хуке у меня не получилось.

Так что берём hook_query_alter (module_name.module)

<?php

/**
 * Подменяет родную таблицу на кэширующую
 *
 * @param AlterableInterface $query
 */
function mymodule_query_alter (AlterableInterface $query) {

    

/**@var \Drupal\Core\Database\Driver\mysql\Select $query*/
    
if ($query->hasTag('views_view_name')) { // имя вьюшки с префиксом views_, или в админке можно задать свой маркер и тогда уже без префикса

        

$tableList = &$query->getTables();

        if (isset(

$tableList['node_field_data'])) {

            

$tableList['node_field_data']['table'] = 'cache_table_node_field_data'// меняем node_field_data на cache_table_node_field_data

        

}

    }

}

?>

Комментарии

Аватар пользователя AlekseyArh AlekseyArh 29 ноября 2017 в 15:57

Я первым делом попробовал этот хук, но не понял как сменить таблицу или запрос целиком, там в примерах меняется только where

Аватар пользователя AlekseyArh AlekseyArh 3 декабря 2017 в 10:42

В общем hook_views_query_alter и прочие view api не подходят.
Эти хуки кстати надо писать не в module_name.module, а в module_name.views_execution.inc
В принципе базовую таблицу можно поменять из хука hook_views_query_alter вот так:

<?php
$views
->storage->set('base_table''ваша_таблица');
?>

Но в запросе будет ошибка, потому что вместе с таблице поменяется её alias, по которому работают выборка, условия и join.
Поменять alias в этом же хуке у меня не получилось.

Так что берём hook_query_alter (module_name.module)

<?php

/**
 * Подменяет родную таблицу на кэширующую
 *
 * @param AlterableInterface $query
 */
function mymodule_query_alter (AlterableInterface $query) {

    

/**@var \Drupal\Core\Database\Driver\mysql\Select $query*/
    
if ($query->hasTag('views_view_name')) { // имя вьюшки с префиксом views_, или в админке можно задать свой маркер и тогда уже без префикса

        

$tableList = &$query->getTables();

        if (isset(

$tableList['node_field_data'])) {

            

$tableList['node_field_data']['table'] = 'cache_table_node_field_data'// меняем node_field_data на cache_table_node_field_data

        

}

    }

}

?>