Professional Documents
Culture Documents
organizan patrocinan
colaboran
Doctrine
Nacho Martín
5 y 6 de julio 2010
Jornadas Symfony Universitat Jaume I, Castellón
http://decharlas.uji.es/symfony
¿Qué es Doctrine?
●
Object Relational Mapper hecho para
PHP >=5.2.3 (Doctrine 2.0 PHP >5.3)
●
Basado en Hibernate (Java)
●
¿Y Propel?
#config/databases.yml
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=midb'
username: usuario
password: secreto
●
Lista ToDo
●
Con items (one-many)
●
Y tags (many-many)
Item:
actAs:
Timestampable: ~
columns:
name: { type: string(255) }
text: { type: string(4000) }
todo_id: { type: integer, notnull: true }
relations:
Todo: { class: Todo, onDelete: CASCADE, local: todo_id, foreign: id, foreignAlias: items }
TodoTag:
columns:
tag_id: { type: integer, primary: true }
todo_id: { type: integer, primary: true }
relations:
Tag: { onDelete: CASCADE, local: tag_id, foreign: id }
Todo: { onDelete: CASCADE, local: todo_id, foreign: id }
Tag:
columns:
name: { type: string(255) }
$this->hasMany('TodoTag', array(
'local' => 'id',
'foreign' => 'tag_id'));
//Behaviour
$timestampable0 = new Doctrine_Template_Timestampable();
$this->actAs($timestampable0);
}
}
Item:
gambas:
name: Comer gambas
Todo: denver
gangsters:
name: Cosas de gangsters
Todo: denver
Tag:
turismo:
name: Turismo gangsteril
Todos: [denver]
●
Simplifica SQL y es portable
●
Incorpora POO a SQL
//Manipulación
1 $list->name = "Cosas que hacer en Denver";
2 $list['name'] = "Cosas que hacer en Denver";
3 $list->set('name', "Cosas que hacer en Denver");
//Acceso
1 echo $list->name;
2 echo $list['name']; //Recomendado (hidratación)
3 echo $list->get('name');
¿No es suficiente?
¡Escribe el tuyo!
●
El acceso por arrays funciona en los dos
métodos de hidratación
●
La hidratación por arrays es más eficiente
si solo queremos consultar datos directos
de la BD
●
fetchArray() es un alias de execute() con
la hidratación por array
●
Uso de foreach, count(), isset(), unset()
//Usando link()
●
Las relaciones son $item = new Item();
intuitivas $item['name'] = "La broma infinita";
$item->link('Todo',array($list['id']));
●
Siempre podemos recurrir $item->save();
a DQL //Borrar
$list->Items[0]->delete();
●
Pero en DQL no se
//Siempre nos quedará DQL
ejecutarán preDelete(), $q = Doctrine_Query::create()
postDelete()... (!) ->delete('Item')
->addWhere('todo_id = ?', $list['id'])
->whereIn('name', array($item['name'], 'otro
nombre'));
$q->execute();
¿Pero y Doctrine2?
Veamos Doctrine2
Jornadas Symfony http://decharlas.uji.es/symfony
Doctrine2
●
Reescritura completa del código para
PHP 5.3
●
Mejoras importantes de rendimiento
●
Menos magia
●
Caché mejorada
●
Entidades
namespace Entities;
DocBlock Annotations
Jornadas Symfony http://decharlas.uji.es/symfony
Entidades (II)
public function getId()
{
return $this->id;
}
●
Adiós al YAML. Se escriben en PHP
●
¿Por qué?
●
Es más rápido cargarlas
●
El código para tratar fixtures en YAML introdujo muchos
bugs en el pasado
●
Atención al uso de espacios de nombre
●
Persist “marca” el objeto para guardar
●
Flush ejecuta la unidad de trabajo
41.4s
$final = microtime(true);
echo $final-$inicio."\n";
/**
* @PreUpdate
*/
public function updated()
{
$this->updated = new DateTime("now");
}
}
http://github.com/guilhermeblanco/Doctrine2-Sluggable-Functional-Behavior
http://github.com/guilhermeblanco/Doctrine2-Hierarchical-Structural-Behavior
http://www.doctrine-project.org/blog/doctrine2-versionable
BD (antes) BD (después)
Esquema Fichero de
migración
Jornadas Symfony http://decharlas.uji.es/symfony
Migraciones (I)
Hacen el esquema versionable
BD (antes) BD (después)
Comparar
Esquema Fichero de
migración
Jornadas Symfony http://decharlas.uji.es/symfony
Migraciones (I)
Hacen el esquema versionable
BD (antes) BD (después)
Comparar
Generar
Esquema Fichero de
migración
Jornadas Symfony http://decharlas.uji.es/symfony
Migraciones (I)
Hacen el esquema versionable
BD (antes) BD (después)
Comparar
Generar
Esquema Fichero de
migración
Jornadas Symfony http://decharlas.uji.es/symfony
Migraciones (I)
Hacen el esquema versionable
Migrar
BD (antes) BD (después)
Comparar
Generar
Esquema Fichero de
migración
Jornadas Symfony http://decharlas.uji.es/symfony
Migraciones (II)
Aspecto de un fichero de migración
class Version20100416130401 extends AbstractMigration
{
public function up(Schema $schema)
{
$table = $schema->createTable('users');
$table->addColumn('username', 'string');
$table->addColumn('password', 'string');
}
●
El ODM tiene el mismo aspecto que el ORM
(métodos parecidos, Entidad → Documento,
EntityManager → DocumentManager,...)
●
Mañana hay una charla sobre MongoDB y
Symfony ;)