hook_query_TAG_alter(Drupal\Core\Database\Query\AlterableInterface $query)
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
- Database abstraction layer
- Allow the use of different database servers using the same code base.
- Hooks
- Define functions that alter the behavior of Drupal core.
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, '>='); } } }
Please login to continue.