/** * Procesa el JOIN y agrega las clausulas y condiciones requeridas * * @param string $joinType */ private function _processJoin($joinType) { $sqlStatement = ''; foreach ($this->_joins[$joinType] as $joinRelations) { $mainEntity = $this->_entities[$joinRelations[0]]; $joinEntity = $this->_entities[$joinRelations[1]]; $hasRelation = false; if (EntityManager::existsHasMany($joinEntity, $mainEntity)) { $relation = EntityManager::getHasManyDefinition($joinEntity, $mainEntity, true); $hasRelation = true; } else { if (EntityManager::existsBelongsTo($joinEntity, $mainEntity)) { $relation = EntityManager::getBelongsToDefinition($joinEntity, $mainEntity); $hasRelation = true; } else { if (EntityManager::existsHasOne($joinEntity, $mainEntity)) { $relation = EntityManager::getHasOneDefinition($joinEntity, $mainEntity); $hasRelation = true; } } } if ($hasRelation == false) { throw new ActiveRecordException('Las entidades "' . $mainEntity . '" y "' . $joinEntity . '" no tienen cardinalidad definida'); } $joinSource = EntityManager::getCompleteSource($joinEntity); $mainSource = EntityManager::getCompleteSource($relation['referencedEntity']); switch ($joinType) { case self::LEFT_JOIN: case self::RIGHT_JOIN: if ($joinType == self::LEFT_JOIN) { $sqlStatement .= ' LEFT OUTER JOIN '; } else { $sqlStatement .= ' RIGHT OUTER JOIN '; } $sqlStatement .= $joinSource . ' ON '; if (is_string($relation['fields'])) { $sqlStatement .= $joinSource . '.' . $relation['fields'] . ' = ' . $mainSource . '.' . $relation['referencedFields']; if ($joinType == self::LEFT_JOIN) { $condition = $joinSource . '.' . $relation['fields'] . ' IS NULL'; } else { $condition = $relation['referencedSource'] . '.' . $mainSource . ' IS NULL'; } $this->_appendCondition($condition); } else { $j = 0; $joinConditions = array(); $whereConditions = array(); foreach ($relation['fields'] as $relationField) { $joinConditions[] = $joinSource . '.' . $relationField . ' = ' . $mainSource . '.' . $relation['referencedFields'][$j]; if ($joinType == self::LEFT_JOIN) { $whereConditions[] = $joinSource . '.' . $relationField . ' IS NULL'; } else { $whereConditions[] = $mainSource . '.' . $relation['referencedFields'][$j] . ' IS NULL'; } $j++; } $sqlStatement .= join(' AND ', $joinConditions); $this->_appendCondition(join(' AND ', $whereConditions)); } break; case self::INNER_JOIN: $sqlStatement .= ' INNER JOIN ' . $joinSource . ' ON '; if (is_string($relation['fields'])) { $sqlStatement .= $joinSource . '.' . $relation['fields'] . ' = ' . $mainSource . '.' . $relation['referencedFields']; } else { $j = 0; $joinConditions = array(); $whereConditions = array(); foreach ($relation['fields'] as $relationField) { $joinConditions[] = $joinSource . '.' . $relationField . ' = ' . $mainSource . '.' . $relation['referencedFields'][$j]; $j++; } $sqlStatement .= join(' AND ', $joinConditions); } break; case self::NATURAL_JOIN: $sqlStatement .= ',' . $joinSource; if (is_string($relation['fields'])) { $condition = $joinSource . '.' . $relation['fields'] . ' = ' . $mainSource . '.' . $relation['referencedFields']; } else { $j = 0; $joinConditions = array(); $whereConditions = array(); foreach ($relation['fields'] as $relationField) { $joinConditions[] = $joinSource . '.' . $relationField . ' = ' . $mainSource . '.' . $relation['referencedFields'][$j]; $j++; } $condition = join(' AND ', $joinConditions); } $this->_appendCondition($condition); break; case self::FULL_JOIN: $sqlStatement .= ' FULL OUTER JOIN ' . $joinSource . ' ON '; if (is_string($relation['fields'])) { $sqlStatement .= $joinSource . '.' . $relation['fields'] . ' = ' . $mainSource . '.' . $relation['referencedFields']; $condition = $joinSource . '.' . $relation['fields'] . ' IS NULL OR ' . $mainSource . '.' . $relation['referencedFields'] . ' IS NULL'; $this->_appendCondition($condition); } else { $j = 0; $joinConditions = array(); $whereConditions = array(); foreach ($relation['fields'] as $relationField) { $joinConditions[] = $joinSource . '.' . $relationField . ' = ' . $mainSource . '.' . $relation['referencedFields'][$j]; $whereConditions[] = $joinSource . '.' . $relationField . ' IS NULL OR ' . $mainSource . '.' . $relation['referencedFields'][$j] . ' IS NULL'; $j++; } $sqlStatement .= join(' AND ', $joinConditions); $this->_appendCondition(join(' AND ', $whereConditions)); } break; case self::CROSS_JOIN: $sqlStatement .= ',' . $joinSource; break; } } return $sqlStatement; }