Poly activerecord - polymedio/polyframework GitHub Wiki

Poly_ActiveRecord

Poly_ActiveRecord es una clase que implementa el patrón http://es.wikipedia.org/wiki/ActiveRecord.

Ejemplo

Plantearemos un ejemplo para explicar la funcionalidad básica. Supongamos que tenemos una tabla usuarios con la siguiente estructura:

<code> +--------------+

usuarios

+--------------+

id (PK)
nombre
apellido
username
password
email

+--------------+ </code>

El modelo correspondiente sería:

<code php> class Usuario extends Poly_ActiveRecord {

public $tableName = 'usuarios'; en este caso no es necesario definirla, ya que para Usuario la tabla por defecto es usuarios } </code>

Manipulación de registros

Siguiendo con el ejemplo, podemos manipular los registros de la tabla usuarios de la siguiente manera:

<code php> $Usuario = new Usuario(); $Usuario->nombre = 'Martin'; $Usuario->apellido = 'Fowler'; $Usuario->username = 'mfowler'; $Usuario->password = sha1('S3cr3t');

$Usuario->save(); o $Usuario->insert(); INSERT INTO usuarios (username, password, nombre, apellido) VALUES ('mfowler', '847adc6fd3b8b307b88dd3d8b48e024635d01501', 'Martin', 'Fowler')

$Usuario->username = 'martin'; $Usuario->save(); o $Usuario->update(); UPDATE usuarios SET username = 'martin', password = '847adc6fd3b8b307b88dd3d8b48e024635d01501', nombre = 'Martin', apellido = 'Fowler' WHERE id = '1' LIMIT 1

$Usuario->save(true, array('username')); UPDATE usuarios SET username = 'martin' WHERE id = '1' LIMIT 1

$Usuario->delete(); DELETE FROM usuarios WHERE id = '1' </code>

Inserción múltiple de registros

Para poder reutilizar una instancia de un registro e insertar un nuevo valor, debemos llamar al método ''Poly_ActiveRecord::reset()''.

Siguiendo con el ejemplo, crearemos varios registros:

<code php> $Usuario->reset(); $Usuario->nombre = 'Ward'; $Usuario->apellido = 'Cunningham'; $Usuario->username = 'ward'; $Usuario->password = sha1('1234'); $Usuario->save();

$Usuario->reset(); $Usuario->nombre = 'Kent'; $Usuario->apellido = 'Beck'; $Usuario->username = 'kent'; $Usuario->password = sha1('5678'); $Usuario->save();

$Usuario->reset(); $Usuario->nombre = 'Alistair'; $Usuario->apellido = 'Cockburn'; $Usuario->username = 'alistair'; $Usuario->password = sha1('qwer'); $Usuario->save(); </code>

Consultas simples

Siguiendo con el ejemplo, podemos realizar consultas de la siguiente manera:

<code php> $usuarios = $Usuario->findAll('id > 1'); SELECT * FROM usuarios WHERE id > 1

pr($usuarios); </code>

El contenido de la variable ''$usuarios'' sería:

<code> Array ( [0] => Usuario Object ( [id] => 2 [username] => ward [password] => 7110eda4d09e062aa5e4a390b0a572ac0d2c [email] => [nombre] => Ward [apellido] => Cunningham ) [1] => Usuario Object ( [displayField] => id [id] => 3 [username] => kent [password] => 2abd55e001c524cb2cf6300a89ca6366848a [email] => [nombre] => Kent [apellido] => Beck ) [2] => Usuario Object ( [id] => 4 [username] => alistair [password] => 1161e6ffd3637b302a5cd74076283a7bd1fc [email] => [nombre] => Alistair [apellido] => Cockburn ) ) </code>

A continuación veremos como realizar algunas consultas:

<code php> $Usuario = new Usuario(3); o $Usuario->read(3); SELECT * FROM usuarios WHERE id = 3 LIMIT 1

$Usuario->findById(2); devuelve el objeto en lugar de asignarlo SELECT * FROM usuarios WHERE id = 2 LIMIT 1

$Usuario->find('nombre = :nombre', array('nombre' => 'ward')); buscar el primero que cumpla la condicion SELECT * FROM usuarios WHERE nombre = 'ward' LIMIT 1

$Usuario->findByNombre('ward'); equivalente al anterior SELECT * FROM usuarios WHERE nombre = 'ward' LIMIT 1

$Usuario->findAll('nombre = :nombre OR apellido = :apellido', array('nombre' => 'ward', 'apellido' => 'beck')); SELECT * FROM usuarios WHERE nombre = 'ward' OR apellido = 'beck'

$Usuario->findAllByNombreOrApellido('ward', 'beck'); igual que el anterior SELECT * FROM usuarios WHERE nombre = 'ward' OR apellido = 'beck'

$Usuario->findCount(); SELECT COUNT(*) FROM usuarios WHERE 1 </code>

Consultas avanzadas

Para mayor flexibilidad podemos realizar consultas complejas llamando a ''Poly_ActiveRecord::query()'' que acepta como parámetros una query SQL y un array con el reemplazo de variables.

<code php> $sql = 'SELECT * FROM usuarios '; $sql .= 'JOIN articulos ON (articulos.usuario_id = usuarios.id) '; $sql .= 'WHERE articulos.fecha > :fecha ORDER BY fecha DESC ';

$Usuario->query($sql, array('fecha' => '2004-07-01')); </code>

Esta misma consulta podria haberse realizado con ''Poly_ActiveRecord::findAll()'', pero existen casos en los que es más práctico realizar una consulta escribiendo toda la query SQL.

Otro método que puede sernos útil es ''Poly_ActiveRecord::queryAssoc()'' que acepta los mismos parámetros que ''Poly_ActiveRecord::query()'' pero devuelve arrays en lugar de objetos.

Relaciones

Poly_ActiveRecord permite definir 4 tipos relaciones con otros modelos:

- hasMany - hasOne - belongsTo - hasAndBelongsToMany

hasMany

Es una relación de uno a muchos, el modelo en el que se define es propietario (tiene muchos) de los objetos a los que apunta la relación. Ej: ''Articulo hasMany Comentario''.

<code php> class Articulo extends Poly_ActiveRecord {

public $hasMany = array( nombre de la variable que contendrá los objetos 'comentarios' => array( 'class' => 'Comentario', nombre de clase del objeto (obligatorio) 'foreignKey' => 'articulo_id', nombre de la clave foránea que relaciona la otra tabla con esta (default) 'persistent' => true, los resultados se almacenan en la variable (default) ), ); } </code>

Debido a la declaración de ''comentarios'' como una relación ''hasMany'', lo siguiente es válido:

<code php> $Articulo = new Articulo(1);

foreach($Articulo->comentarios as $Comentario) {

echo $Comentario->texto;

} </code>

hasOne

Es una relación de uno a uno, el modelo en el que se define es propietario (tiene uno) de uno del los objetos a los que apunta la relación. Ej: ''Usuario hasOne Perfil''. La prinicpal diferencia con hasMany es que solo se retorna una instancia. Sólo se provee esta relación para aquellos casos en los que es semánticamente correcta.

<code php> class Usuario extends Poly_ActiveRecord {

public $hasOne = array( 'Perfil' => array( 'class' => 'Perfil', solo agregamos el parámetro obligatorio ), ); } </code>

belongsTo

Es una relación de muchos a uno, es la relación opuesta a ''hasMany/hasOne''. El modelo en el que se define es propiedad (pertence a) del modelo al que apunta la relación. Continuando con el ejemplo anterior, ''Comentario belongsTo Articulo'':

<code php> class Comentario extends Poly_ActiveRecord {

public $belongsTo = array( 'Articulo' => array( 'class' => 'Articulo', solo agregamos el parámetro obligatorio ), );

}

</code>

Teniendo definida la relación, lo siguiente es válido:

<code php> $Comentario = new Comentario(13); SELECT * FROM comentarios WHERE id = 13 LIMIT 1

echo $Comentario->Articulo->titulo; SELECT * FROM articulos WHERE id = '1' LIMIT 1

</code>

Si hemos definido ambos lados de la relación ''hasMany/belongsTo'' nos será posible crear instancias de los modelos relacionados:

<code php> $Articulo = new Articulo(); $Articulo->titulo = 'Poly framework'; $Articulo->texto = 'Poly framework posee un diseño simple y elegante.'; $Articulo->save(); INSERT INTO articulos (titulo, texto) VALUES ('Poly framework', 'Poly framework posee un diseño simple y elegante.')

$Comentario = $Articulo->createComentario(); Equivalente a : $Comentario = new Comentario(); $Comentario->articulo_id = $Articulo->id;

$Comentario->texto = 'Poly framework mola!'; $Comentario->save(); INSERT INTO comentarios (articulo_id, texto) VALUES ('1', 'Poly framework mola!')

</code>

hasAndBelongsToMany

Es una relación de muchos a muchos. Existe una tabla intermedia definida como ''joinTable'' que registra los enlaces entre ambos modelos. Continuando con el ejemplo anterior, ''Articulo hasAndBelongsToMany Tag'':

<code php>

class Articulo extends Poly_ActiveRecord {

public $hasAndBelongsToMany = array(

'tags' => array( 'class' => 'Tag', nombre de clase del objeto (obligatorio) 'joinTable' => 'articulo_tag', tabla intermedia, (default: en orden alfabético) 'selfKey' => 'articulo_id', clave foránea que apunta al modelo actual (default) 'foreignKey' => 'tag_id', clave foránea que apunta al modelo relacionado (default) ), );

public $hasMany = array( 'comentarios' => array( 'class' => 'Comentario', 'foreignKey' => 'articulo_id', ), );

public $belongsTo = array( 'Autor' => array( 'class' => 'Usuario', 'foreignKey' => 'autor_id', ), );

} </code>

Teniendo definida la relación, lo siguiente es válido:

<code php>

$Articulo = new Articulo(1); SELECT * FROM articulos WHERE id = 1 LIMIT 1

foreach ($Articulo->tags as $Tag) {

echo $Tag->titulo;

} SELECT tags.* FROM tags LEFT JOIN articulos_tags ON (articulos_tags.tag_id = tags.id) WHERE articulo_id = '1'

</code>

⚠️ **GitHub.com Fallback** ⚠️