/** * {@inheritdoc} */ public function finishQuery($select_query, $id_key = 'entity_id') { $entity_type = $this->entityConditions['entity_type']['value']; foreach ($this->getRelationships() as $delta => $relationship) { // A relational filter consists of a chain of relationships and a value // for a condition at the end. // Relationships start with the entity base table. $entity_info = entity_get_info($entity_type); $entity_table = $entity_table_alias = $entity_info['base table']; // Add the table if the base entity table was not added because: // 1. There was a fieldCondition or fieldOrderBy, AND // 2. There was no property condition ot order. if ($delta == 0) { $is_entity_table_present = FALSE; $field_base_table_alias = NULL; foreach ($select_query->getTables() as $table_info) { // Search for the base table and check if the entity table is present // for the resource's entity type. if (!$field_base_table_alias && empty($table_info['join type'])) { $field_base_table_alias = $table_info['alias']; } if ($table_info['table'] == $entity_table) { $is_entity_table_present = TRUE; break; } } if (!$is_entity_table_present && $field_base_table_alias) { // We have the base table and we need to join it to the entity table. _field_sql_storage_query_join_entity($select_query, $entity_type, $field_base_table_alias); } } // Pop the last item, since it is the one that has to match the filter and // will have the WHERE associated. $condition = array_pop($relationship['relational_filters']); foreach ($relationship['relational_filters'] as $relational_filter) { /* @var RelationalFilterInterface $relational_filter */ if ($relational_filter->getType() == RelationalFilterInterface::TYPE_FIELD) { $field_table_name = _field_sql_storage_tablename(field_info_field($relational_filter->getName())); $field_table_alias = $this::aliasJoinTable($field_table_name, $select_query); $select_query->addJoin('INNER', $field_table_name, $field_table_alias, sprintf('%s.%s = %s.%s', $entity_table_alias, $entity_info['entity keys']['id'], $field_table_alias, $id_key)); // Get the entity type being referenced. $entity_info = entity_get_info($relational_filter->getEntityType()); $entity_table_alias = $this->aliasJoinTable($entity_info['base table'], $select_query); $select_query->addJoin('INNER', $entity_info['base table'], $entity_table_alias, sprintf('%s.%s = %s.%s', $field_table_name, _field_sql_storage_columnname($relational_filter->getName(), $relational_filter->getColumn()), $entity_table_alias, $entity_info['entity keys']['id'])); } elseif ($relational_filter->getType() == RelationalFilterInterface::TYPE_PROPERTY) { // In this scenario we want to join with the new table entity. This // will only work if the property contains the referenced entity ID // (which is not unreasonable). $host_entity_table = $entity_table; $entity_info = entity_get_info($relational_filter->getEntityType()); $entity_table_alias = $this->aliasJoinTable($entity_info['base table'], $select_query); $select_query->addJoin('INNER', $entity_info['base table'], $entity_table_alias, sprintf('%s.%s = %s.%s', $host_entity_table, $relational_filter->getName(), $entity_table_alias, $entity_info['entity keys']['id'])); } } /* @var RelationalFilterInterface $condition */ if ($condition->getType() == RelationalFilterInterface::TYPE_FIELD) { // Make the join to the filed table for the condition. $field_table_name = _field_sql_storage_tablename(field_info_field($condition->getName())); $field_column = _field_sql_storage_columnname($condition->getName(), $condition->getColumn()); $field_table_alias = $this::aliasJoinTable($field_table_name, $select_query); $select_query->addJoin('INNER', $field_table_name, $field_table_alias, sprintf('%s.%s = %s.%s', $entity_table_alias, $entity_info['entity keys']['id'], $field_table_alias, $id_key)); if (in_array($relationship['operator'], array('IN', 'BETWEEN'))) { $select_query->condition($field_table_name . '.' . $field_column, $relationship['value'], $relationship['operator'][0]); } else { for ($index = 0; $index < count($relationship['value']); $index++) { $select_query->condition($field_table_name . '.' . $field_column, $relationship['value'][$index], $relationship['operator'][$index]); } } } elseif ($condition->getType() == RelationalFilterInterface::TYPE_PROPERTY) { if (in_array($relationship['operator'], array('IN', 'BETWEEN'))) { $select_query->condition($entity_table_alias . '.' . $condition->getName(), $relationship['value'], $relationship['operator'][0]); } else { for ($index = 0; $index < count($relationship['value']); $index++) { $select_query->condition($entity_table_alias . '.' . $condition->getName(), $relationship['value'][$index], $relationship['operator'][$index]); } } } } return parent::finishQuery($select_query, $id_key); }