/** * Salva os objetos vinculados a este que dependem deste * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/lumine * @return void */ protected function saveDependentObjects() { $schema = $this->_getConfiguration()->getOption('schema_name'); if (!empty($schema)) { $schema .= '.'; } foreach ($this->metadata()->getRelations() as $name => $def) { switch ($def['type']) { case Lumine_Metadata::ONE_TO_MANY: $list = $this->fieldValue($name); if (!empty($list) && is_array($list)) { foreach ($list as $val) { if ($val instanceof Lumine_Base) { $relname = $this->metadata()->getClassname(); try { $field = $val->metadata()->getRelation($relname, Lumine_Metadata::MANY_TO_ONE); $val->setFieldValue($field['name'], $this->{$field}['linkOn']); $val->save(); } catch (Lumine_Exception $e) { Lumine_log::warning('nao foi possivel encontrar o campo ' . $relname . ' em ' . $val->metadata()->getClassname()); } } } } break; case Lumine_Metadata::MANY_TO_MANY: $list = $this->{$name}; if (!empty($list) && is_array($list)) { foreach ($list as $val) { // se for uma instancia de Lumine_Base if ($val instanceof Lumine_Base) { // pega o valor da chave primaria $f1 = $this->metadata()->getField($def['linkOn']); $v1 = $this->fieldValue($def['linkOn']); // salva o objeto $val->save(); // valor do outro objeto $rel = $val->metadata()->getRelation($this->metadata()->getClassname(), Lumine_Metadata::MANY_TO_MANY); $f2 = $val->metadata()->getField($rel['linkOn']); $v2 = $val->fieldValue($f2['name']); // se ambos nao forem nulos if (!is_null($v1) && !is_null($v2)) { // verifica se ja existe $sv1 = Lumine_Parser::getParsedValue($this, $v1, $f1['type']); $sv2 = Lumine_Parser::getParsedValue($val, $v2, $f2['type']); $sql = "SELECT * FROM " . $schema . $def['table'] . " WHERE "; $sql .= $def['column'] . '=' . $sv1; $sql .= ' AND '; $sql .= $rel['column'] . '=' . $sv2; $ref = new ReflectionClass(get_class($this)); $ponte = $ref->newInstance(); Lumine_Log::debug('Verificando existencia da referencia do objeto no banco: ' . $sql); $ponte->query($sql); // se nao existir if ($ponte->numrows() == 0) { // insert $sql = "INSERT INTO " . $schema . $def['table'] . "(%s, %s) VALUES (%s, %s)"; $sql = sprintf($sql, $def['column'], $rel['column'], $sv1, $sv2); $ponte->query($sql); } $ponte->destroy(); } } else { // pega o valor do campo desta classe $campo = $this->metadata()->getField($def['linkOn']); $valor_pk = $this->fieldValue($campo['name']); // se este objeto tem um valor no campo indicado if (!is_null($valor_pk)) { // primeiro vemos se este valor ja nao existe $sql = "SELECT * FROM " . $schema . $def['table'] . " WHERE "; // pega o valor do campo desta entidade $valor_objeto = Lumine_Parser::getParsedValue($this, $valor_pk, $campo['type']); // instanciamos a classe estrangeira $this->_getConfiguration()->import($def['class']); $obj = new $def['class'](); // pega o relacionamento com esta entidade $rel = $obj->metadata()->getRelation($this->metadata()->getClassname(), Lumine_Metadata::MANY_TO_MANY); $rel_def = $obj->metadata()->getField($rel['linkOn']); // ajusta o valor $valor_estrangeiro = Lumine_Parser::getParsedValue($obj, $val, $rel_def['type']); // termina a SQL $sql .= $def['column'] . '=' . $valor_objeto; $sql .= " AND "; $sql .= $rel['column'] . '=' . $valor_estrangeiro; $obj->query($sql); $res = $obj->numrows(); // se nao encontrou if ($res == 0) { // insere $sql = "INSERT INTO %s (%s,%s) VALUES (%s,%s)"; $sql = sprintf($sql, $schema . $def['table'], $def['column'], $rel['column'], $valor_objeto, $valor_estrangeiro); Lumine_Log::debug("Inserindo valor Many-To-Many: " . $sql); $obj->query($sql); } $obj->destroy(); } else { Lumine_Log::warning('A o campo "' . $pks[0]['name'] . ' da classe "' . $this->metadata()->getClassname() . '" nao possui um valor'); } } } } break; } } }
/** * Monta a SQL que sera executada * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @return string */ public function getSQL() { if (empty($this->_union)) { Lumine_Log::warning('Nenhuma classe incluida para realizar a uniao'); return false; } $sql = array(); foreach ($this->_union as $obj) { $sql[] = "(" . trim($obj->_getSQL(Lumine_Base::SQL_SELECT)) . ")"; } if (!empty($this->_data)) { $strSQL = 'SELECT ' . Lumine_Parser::parseSQLValues($this, implode(', ', $this->_data)) . ' FROM '; } else { $strSQL = ' SELECT * FROM '; } $strSQL .= '(' . implode(PHP_EOL . ' UNION ' . PHP_EOL, $sql) . ') AS LUMINE_UNION'; if (!empty($this->_where)) { $strSQL .= PHP_EOL . " WHERE " . implode(' AND ', $this->_where); } if (!empty($this->_group)) { $strSQL .= PHP_EOL . " GROUP BY " . implode(', ', $this->_group); } if (!empty($this->_having)) { $strSQL .= PHP_EOL . " HAVING " . implode(' AND ', $this->_having); } if (!empty($this->_order)) { $strSQL .= PHP_EOL . " ORDER BY " . implode(', ', $this->_order); } $strSQL .= PHP_EOL . $this->_union[0]->_getConnection()->setLimit($this->_offset, $this->_limit); return $strSQL; }