/** * {@inheritdoc} */ public function entityQueryAlter(SelectInterface $query) { $tables = $query->getTables(); $data_table = 'comment_field_data'; if (!isset($tables['comment_field_data']['alias'])) { // If no conditions join against the comment data table, it should be // joined manually to allow node access processing. $query->innerJoin($data_table, NULL, "base_table.cid = {$data_table}.cid AND {$data_table}.default_langcode = 1"); } // The Comment module doesn't implement any proper comment access, // and as a consequence doesn't make sure that comments cannot be viewed // when the user doesn't have access to the node. $node_alias = $query->innerJoin('node_field_data', 'n', '%alias.nid = ' . $data_table . '.entity_id AND ' . $data_table . ".entity_type = 'node'"); // Pass the query to the node access control. $this->reAlterQuery($query, 'node_access', $node_alias); // Passing the query to node_query_node_access_alter() is sadly // insufficient for nodes. // @see SelectionEntityTypeNode::entityQueryAlter() if (!\Drupal::currentUser()->hasPermission('bypass node access') && !count(\Drupal::moduleHandler()->getImplementations('node_grants'))) { $query->condition($node_alias . '.status', 1); } }
/** * Joins a field's table into a database select query. * * @param array $field * The field information array. The "table" key should contain the table * name to which a join should be made. * @param \Drupal\Core\Database\Query\SelectInterface $db_query * The database query used. * @param bool $new_join * (optional) If TRUE, a join is done even if the table was already joined * to in the query. * @param string $join * (optional) The join method to use. Must be a method of the $db_query. * Normally, "join", "innerJoin", "leftJoin" and "rightJoin" are supported. * * @return string * The alias for the field's table. */ protected function getTableAlias(array $field, SelectInterface $db_query, $new_join = FALSE, $join = 'leftJoin') { if (!$new_join) { foreach ($db_query->getTables() as $alias => $info) { $table = $info['table']; if (is_scalar($table) && $table == $field['table']) { return $alias; } } } return $db_query->$join($field['table'], 't', 't.item_id = %alias.item_id'); }
public function &getTables() { return $this->query->getTables(); }