我正在使用Zend Framework并试图对我正在制作的网站使用“快速入门”指南,以了解该流程的工作原理。如果这个答案很明显,请原谅我,希望有经验的人可以对此有所了解。
我有三个数据库表:
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
我想创建一个在某些情况下使用所有三个表的用户模型。例如,如果/当需要元数据时,访问元数据表。仅当设置了“Default”auth_method时才访问user_password表。我稍后可能会添加一个配置文件表,我希望能够从用户模型访问。
使用ZF做到这一点的最佳方法是什么?为什么?
答案 0 :(得分:23)
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'
)
);
获取数据:
$id = //get your user id from somewhere
$users = new Users();
$user = $users->fetchRow('id=?', $id);
if ($user->authMethod == 0)
{
$metadata = $user->findDependentRowset('UserMetadata')->current();
}
或
$user = $users->fetchRow($users->select()
->where('gender=?, 'M')
->order('email ASC');
......等等。
插入数据:
$newRow = $users->fetchNew();
$newRow->email = me@domain.com;
$newRow->save();
或
$users = new Users();
$data = array('email' => 'me@domain.com',
'firstname' => 'Me');
$users->insert($data);
更新
$user->email = 'me@domain.org';
$user->save();
删除行:
$user->delete();
使用交易:
$db->beginTransaction();
$db->commit();
$db->rollback();
等......全部都在ZF Manual!
答案 1 :(得分:2)
基本上不使用Zend_Db_Table
而是使用更通用的Zend_Db_Select
或Zend_Db_Statement
来检索数据。
顺便说一句。您可能希望不直接在用户模型中访问密码数据,而是在从Zend_Auth_Adapter
派生的用户身份验证类中访问。
答案 2 :(得分:2)
简而言之,我会为每个表创建一个模型,而不是一个访问所有三个模型的模型。然后我会在表之间define relationships。
说实话,为每个表创建一个模型似乎不是很“干”,但这是我在网上的各种例子中反复看到的,这是我在少数几个项目中所做的使用Zend Framework创建。如果有人有更好的处理方式,我希望将在此处发布。
答案 3 :(得分:0)
我想说使用ZF执行此操作的最佳方法是使用Doctrine。
答案 4 :(得分:0)
直接蝙蝠的几个音符:
第一个User表看起来更像是一个Person表,除了auth方法,但你可以把它放在User_Password表中,你可以重命名User。 User_Metadata表似乎可以与User_Password / User表合并。
现在,即使没有这些更改,您也有三个不同的表,有三个不同的概念,如果您将每个表分别设置为不同的类,然后将UserModel类作为访问每个类的外观,可能会让它更容易。