Objetos persistentes

En este capítulo veremos detalles sobre adición, actulazación, y eliminación de objetos desde el almacenamiento de datos.

Adicionando Objetos

Inserción simple

Adicionar objetos a su almacenamiento de datos es en efecto insertar filas destro de su tabla. Esto es fácilmente hecho por Propel, simplemente hay que crear un nueva instancia de la clase aporiada e invocarn el método save().

// Crear un nuevo autor
$author = new Author();
$author->setFirstName("Leo");
$author->setLastName("Tolstoy");
 
$author->save();
// ahora ajustamos la llave primaria
$author_id = $author->getId();

Inserción en "cascada"

En ejemplo anterior una simple columna fué insertada en la base de datos. En muchos casos, o como sea, usted necesitará trabajar con registros inter-relacionados, y un simple llamado al método save() puede resultar en escribir más de un registro a la base de datos.

// Crear autor
$author = new Author();
$author->setFirstName("John");
$author->setLastName("Smith");
 
// Crear publisista
$publisher = new Publisher();
$publisher->setName("Penguin");

// Crear el libro de J.Smith
$book = new Book();
$book->setISBN("111-2222-3333");
$book->setTitle("Fake Title");
$book->setPublisher($publisher);
$book->setAuthor($author);

// guardar el libro (book) hará que se almacenen también
// los registros autor y publisista 
$book->save(); // adicionará 3 registros a la base de datos

Esa es la forma más fácil de adicionar objetos y tenerlos automáticamente cuando el item relacionado es guardado. Usted puede también manualmente especificar las llaves foraneass, lo que significa que necesitaró adicionar unas cuantas líneas más de código:

// Crear Autor
$author = new Author();
$author->setFirstName("John");
$author->setLastName("Smith");
$author->save();
 .
 .
$book = new Book();
$book->setAuthorId($author->getId());
 .
 .

Actualizando Objetos

Una simple actualización de datos es completada cuando un objeto es modificado(usando los métodos set*()) y el método save() es invocado. En su código esto luce igual al código para insertar un nuevo registro la única diferencia es que el objeto a modificar posee una llave primaria asignada previamente.

$obj = AuthorPeer::retrieveByPK(1); // get Author where pkey is 1
$obj->setFirstName($obj->getFirstName() . "-modiified");
$obj->save();  // performs UPDATE
 
// UPDATE Author 
//        SET author.FIRST_NAME = '".$obj->getFirstName()."-modified' 
//        WHERE author.AUTHOR_ID = 1

Eliminando Objetos

Para eliminar registros usted puede llamar al método delete() del objeto o usar el método doDelete() de peer.

El método delete() elimina el objeto de la base de datos (por llave primaria). Tmbién ajusta el estado del objeto a "aliminado". Usted puede todavia recuperar las propiedades de objetos eliminados, pero no puede guardar objetos eliminados.

$author = AuthorPeer::retrieveByPk(1);
$author->delete();

// DELETE FROM author WHERE author.AUTHOR_ID = 1

Cuando usa el método doDelete() de peer, usted puede especificar cualquier criterio que desee cuando el rendimiento es eliminado; en este ejemplo hemos eliminado un simple registro de la tabla author.

$crit = new Criteria();
$crit->add(AuthorPeer::AUTHOR_ID, 1);
AuthorPeer::doDelete($crit);
// DELETE FROM author WHERE author.AUTHOR_ID = 1

Propel incluso soporta eliminación en cascada (incluyendo emulación para bases de datos que no lo soportan nativamente), el cual es descrito con más detalle en el capitulo de relaciones [eliminación en cascada].