function hook_query_TAG_alter

Same name in other branches
  1. 9 core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
  2. 8.9.x core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
  3. 10 core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
  4. 11.x core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()

Perform alterations to a structured query for a given tag.

Parameters

$query: An Query object describing the composite parts of a SQL query.

See also

hook_query_alter()

node_query_node_access_alter()

QueryAlterableInterface

SelectQueryInterface

Related topics

9 functions implement hook_query_TAG_alter()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

database_test_query_database_test_alter_remove_range_alter in modules/simpletest/tests/database_test.module
Implements hook_query_TAG_alter().
field_test_query_efq_table_prefixing_test_alter in modules/field/tests/field_test.module
Implements hook_query_TAG_alter() for tag 'efq_table_prefixing_test'.
field_test_query_store_global_test_query_alter in modules/field/tests/field_test.module
Implements hook_query_TAG_alter() for tag 'store_global_test_query'.
node_query_entity_field_access_alter in modules/node/node.module
Implements hook_query_TAG_alter().
node_query_node_access_alter in modules/node/node.module
Implements hook_query_TAG_alter().

... See full list

File

modules/system/system.api.php, line 3335

Code

function hook_query_TAG_alter(QueryAlterableInterface $query) {
    // Skip the extra expensive alterations if site has no node access control modules.
    if (!node_access_view_all_nodes()) {
        // Prevent duplicates records.
        $query->distinct();
        // The recognized operations are 'view', 'update', 'delete'.
        if (!($op = $query->getMetaData('op'))) {
            $op = 'view';
        }
        // Skip the extra joins and conditions for node admins.
        if (!user_access('bypass node access')) {
            // The node_access table has the access grants for any given node.
            $access_alias = $query->join('node_access', 'na', '%alias.nid = n.nid');
            $or = db_or();
            // If any grant exists for the specified user, then user has access to the node for the specified operation.
            foreach (node_access_grants($op, $query->getMetaData('account')) as $realm => $gids) {
                foreach ($gids as $gid) {
                    $or->condition(db_and()->condition($access_alias . '.gid', $gid)
                        ->condition($access_alias . '.realm', $realm));
                }
            }
            if (count($or->conditions())) {
                $query->condition($or);
            }
            $query->condition($access_alias . 'grant_' . $op, 1, '>=');
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.