/** * Se recibe un objecto a la que ya se ha verificado que debe insertarse en la base de datos. * @param $object POs a salvar. */ private function insert_query($object, $tableName = NULL) { Logger::getInstance()->dal_log("DAL:insert_query " . __FILE__ . " " . __LINE__); // INSERT INTO hello_world_persona ( nombre ,edad ,class ,id ,deleted ) VALUES ('pepe' ,'12' ,'Persona' ,'6' ,'' ); if (!$tableName) { $tableName = YuppConventions::tableName($object); } $q = "INSERT INTO " . $tableName . " ( "; // DBSTD $attrs = $object->getAttributeTypes(); // Recorro todos los atributos simples... $tableAttrs = ""; foreach ($attrs as $attr => $type) { $tableAttrs .= DatabaseNormalization::col($attr) . " ,"; // DBSTD } $tableAttrs = substr($tableAttrs, 0, sizeof($tableAttrs) - 2); $q .= $tableAttrs; $q .= ") VALUES ("; // El codigo es distinto al de update porque la forma de la consulta es distinta. // TODO: Si el valor es null tengo que poner null en la tabla, no el string vacio. // TODO: Verificar atributos no nullables en null en la instancia de la clase, esto falta agregar cosas a la clase persistente, "las restricciones" $tableVals = ""; foreach ($attrs as $attr => $type) { $value = $object->aGet($attr); // Valor del atributo simple. if ($value === NULL) { $tableVals .= "NULL ,"; } else { if (is_string($value)) { $tableVals .= "'" . addslashes($value) . "' ,"; } else { if (is_bool($value)) { $tableVals .= "'" . ($value === true ? "1" : "0") . "' ,"; } else { $tableVals .= "'" . $value . "' ,"; } } } // FIXME: OJO, si no es literal no deberia poner comillas !!!! y si es null deberia guardar null //echo $attr . " tiene tipo: " . gettype($value) . " y valor '" . $value . "'<br/>"; } $tableVals = substr($tableVals, 0, sizeof($tableVals) - 2); $q .= $tableVals; $q .= ");"; // Si hay una excepcion, llega hasta la capa superior. $this->db->execute($q); }
public function aGet($attr) { //Logger::getInstance()->po_log("PO:aGet $attr"); // Si no es un atributo simple tengo que ver si hago lazy load... if (!array_key_exists($attr, $this->attributeTypes)) { // Si llega aqui estoy seguro de que no pide un atributo simple, se pide uno complejo. // Podria ser simple pero se paso un nombre normalizado para una columna. // Si el rol tiene el nombre de la assoc declarado, necesito ver cual es el nombre // completo de la key en hasOne o hasMany porque usa attribute__assocName. $attr = $this->getRoleWithAssocName($attr); // Soporte para lazy loading para hasOne y hasMany // No verifico que tenga valor porque deberia venir inicializado //if ( isset($this->attributeValues[$attr]) && $this->attributeValues[$attr] === self::NOT_LOADED_ASSOC ) if ($this->attributeValues[$attr] === self::NOT_LOADED_ASSOC) { // Si no tiene ID todavia no se guardo, entonces no puede cargar lazy algo que no se ha guardado. if (!isset($this->attributeValues['id'])) { return NULL; } $pm = PersistentManager::getInstance(); if (array_key_exists($attr, $this->hasMany)) { $pm->get_many_assoc_lazy($this, $attr); // El atributo se carga, no tengo que setearlo... // Se marca el dirtyMany al pedir hasMany porque no se tiene control // sobre como se van a modificar las instancias de la relacion solicitadas, // si dirtyMany esta en false y las intancias son modificadas, al salvar esta // intancia, las hasMany no se van a salvar en cascada. $this->dirtyMany = true; } else { if (array_key_exists($attr, $this->hasOne)) { // Si hay id de asociacion, lo cargo, si no lo pongo en NULL $assocAttr = DatabaseNormalization::simpleAssoc($attr); // email_id $assocId = $this->attributeValues[$assocAttr]; if ($assocId != NULL) { $this->attributeValues[$attr] = $pm->get_object($this->hasOne[$attr], $assocId); // Se marca el dirtyOne al pedir hasOne porque no se tiene control sobre como se va a modificar la instancia solicitada. $this->dirtyOne = true; } else { $this->attributeValues[$attr] = NULL; } } else { // Aun puede ser simple porque se pide por el nombre de la columna en lugar del nombre del atributo, // entonces primero hay que buscar si no se pide por el nombre de la columna. Idem a lo que hago en aSet. foreach ($this->attributeTypes as $classAttr => $type) { if (DatabaseNormalization::col($classAttr) == $attr) { if (isset($this->attributeValues[$classAttr])) { return $this->attributeValues[$classAttr]; } else { return NULL; } } } throw new Exception("El atributo " . $attr . " no existe en la clase (" . get_class($this) . ")"); } } } // si no esta cargada } // si no es simple // Devuelve atributo hasOne o hasMany (la devolucion de atributos simples se hace arriba). // Si el hasOne o hasMany no estaban cargados, fueron cargados bajo demanda y devueltos aqui. if (isset($this->attributeValues[$attr])) { return $this->attributeValues[$attr]; } return NULL; }