zend framework php zend-framework model

framework php zend



Modelar objetos con mĂșltiples relaciones de tabla en Zend Framework (5)

Estoy jugando con Zend Framework e intento usar la guía "QuickStart" contra un sitio web que estoy creando solo para ver cómo funcionaría el proceso. Perdónenme si esta respuesta es obvia, con suerte alguien con experiencia puede arrojar algo de luz sobre esto.

Tengo tres tablas de base de datos:

CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `email` varchar(255) NOT NULL, `username` varchar(255) NOT NULL default '''', `first` varchar(128) NOT NULL default '''', `last` varchar(128) NOT NULL default '''', `gender` enum(''M'',''F'') default NULL, `birthyear` year(4) default NULL, `postal` varchar(16) default NULL, `auth_method` enum(''Default'',''OpenID'',''Facebook'',''Disabled'') NOT NULL default ''Default'', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 CREATE TABLE `user_password` ( `user_id` int(11) NOT NULL, `password` varchar(16) NOT NULL default '''', PRIMARY KEY (`user_id`), UNIQUE KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 CREATE TABLE `user_metadata` ( `user_id` int(11) NOT NULL default ''0'', `signup_date` datetime default NULL, `signup_ip` varchar(15) default NULL, `last_login_date` datetime default NULL, `last_login_ip` varchar(15) default NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1

Quiero crear un modelo de usuario que use las tres tablas en ciertas situaciones. Por ejemplo, se accede a la tabla de metadatos si / cuando se necesitan los metadatos. Se accede a la tabla user_password solo si se establece el valor predeterminado ''auth_method''. Es probable que agregue una tabla de perfil más adelante a la que me gustaría poder acceder desde el modelo de usuario.

¿Cuál es la mejor manera de hacer esto con ZF y por qué?


Básicamente, en lugar de utilizar Zend_Db_Table utilice Zend_Db_Select o Zend_Db_Statement más generales para recuperar datos.

Por cierto. Es posible que desee acceder a datos de contraseña no directamente en el modelo de usuario, sino en su clase de autenticación de usuario derivada de Zend_Auth_Adapter .


Diría que la mejor manera de hacer esto con ZF es mediante el uso de Doctrine .


En resumen, crearía un modelo para cada mesa, no un modelo que tenga acceso a las tres. Entonces definiría las relaciones entre las tablas.

Para ser sincero, no parece muy "SECO" tener que crear un modelo para cada tabla, pero eso es lo que veo repetidamente en los diversos ejemplos en línea y es lo que he hecho en el puñado de proyectos que he creado con el Zend Framework. Si alguien tiene una mejor manera de manejar esto, espero que lo publique aquí.


Solo unas pocas notas al principio:

La primera tabla de Usuario, parece más una tabla de Persona, a excepción del método auth, pero podría ponerla en la tabla User_Password, que probablemente podría renombrar como Usuario. La tabla User_Metadata parece que podría fusionarse con la tabla User_Password / User.

Ahora, incluso sin esos cambios, tiene tres tablas distintas, con tres conceptos distintos, si modela cada una de esas clases separadas como diferentes, y luego tenía una clase de modelo de usuario como una especie de fachada para acceder a cada una, probablemente lo haría más fácil. .


class Users extends Zend_Db_Table_Abstract { protected $_name = ''users''; protected $_rowClass = ''User''; protected $_dependentTables = array (''UserMetadata'', ''UserPassword''); ... class UserMetadata extends Zend_Db_Table_Abstract { protected $_name = ''user_metadata''; protected $_referenceMap = array ( ''Users''=> array ( ''columns''=>''user_id'', ''refTableClass''=>''Users'', ''refColumns''=>''id'' ) ); ... class UserPassword extends Zend_Db_Table_Abstract { protected $_name = ''user_password''; protected $_referenceMap = array ( ''Users''=> array ( ''columns''=>''user_id'', ''refTableClass''=>''Users'', ''refColumns''=>''id'' ) );

Recuperacion de datos:

$id = //get your user id from somewhere $users = new Users(); $user = $users->fetchRow(''id=?'', $id); if ($user->authMethod == 0) { $metadata = $user->findDependentRowset(''UserMetadata'')->current(); }

o

$user = $users->fetchRow($users->select() ->where(''gender=?, ''M'') ->order(''email ASC'');

... etc.

Insertar datos:

$newRow = $users->fetchNew(); $newRow->email = [email protected]; $newRow->save();

o

$users = new Users(); $data = array(''email'' => ''[email protected]'', ''firstname'' => ''Me''); $users->insert($data);

Actualización:

$user->email = ''[email protected]''; $user->save();

Eliminar una fila:

$user->delete();

Usando la transacción:

$db->beginTransaction(); $db->commit(); $db->rollback();

etc ... ¡todo está en el Manual de ZF !