示例#1
0
 /**
  * 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;
         }
     }
 }
示例#2
0
 /**
  * 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;
 }