function hook_query_TAG_alter
Same name in other branches
- 9 core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
- 8.9.x core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
- 10 core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()
- 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
node_query_node_access_alter()
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().
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.