function hook_query_TAG_alter in Zircon Profile 8.0
Same name and namespace in other branches
- 8 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()
AlterableInterface
SelectInterface
Related topics
7 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 core/
modules/ system/ tests/ modules/ database_test/ database_test.module - Implements hook_query_TAG_alter().
- field_test_query_efq_metadata_test_alter in core/
modules/ field/ tests/ modules/ field_test/ field_test.module - Implements hook_query_TAG_alter() for tag 'efq_metadata_test'.
- field_test_query_efq_table_prefixing_test_alter in core/
modules/ field/ tests/ modules/ field_test/ field_test.module - Implements hook_query_TAG_alter() for tag 'efq_table_prefixing_test'.
- node_query_node_access_alter in core/
modules/ node/ node.module - Implements hook_query_TAG_alter().
- search_query_alter_query_search_node_search_alter in core/
modules/ search/ tests/ modules/ search_query_alter/ search_query_alter.module - Implements hook_query_TAG_alter(): tag search_$type with $type node_search.
File
- core/
lib/ Drupal/ Core/ Database/ database.api.php, line 422 - Hooks related to the Database system and the Schema API.
Code
function hook_query_TAG_alter(Drupal\Core\Database\Query\AlterableInterface $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 (!\Drupal::currentUser()
->hasPermission('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, '>=');
}
}
}