20

我正在玩弄 Zend 框架并尝试对我正在制作的网站使用“快速入门”指南,以了解该过程如何工作。如果这个答案很明显,请原谅我,希望有经验的人可以对此有所了解。

我有三个数据库表:

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

我想创建一个在某些情况下使用所有三个表的用户模型。例如,如果/当需要元数据时访问元数据表。只有设置了“默认”auth_method,才能访问 user_password 表。稍后我可能会添加一个我希望能够从用户模型访问的配置文件表。

采埃孚最好的方法是什么?为什么?

4

5 回答 5

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');

... ETC。

插入数据:

$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 手册中!

于 2009-03-12T21:53:45.570 回答
2

基本上而不是Zend_Db_Table使用更通用的Zend_Db_SelectZend_Db_Statement检索数据。

顺便提一句。您可能希望不直接在 User 模型中访问密码数据,而是在派生自Zend_Auth_Adapter.

于 2009-03-12T13:37:09.987 回答
2

简而言之,我将为每个表创建一个模型,而不是一个访问所有三个表的模型。然后我会定义表之间的关系。

老实说,必须为每个表创建一个模型似乎不是很“干”,但这是我在网上的各种示例中反复看到的,这也是我在使用Zend 框架。如果有人有更好的处理方法,我希望将其发布在这里。

于 2009-03-12T21:36:10.853 回答
0

我想说用 ZF 做到这一点的最好方法是使用Doctrine

于 2009-03-12T16:01:03.000 回答
0

只需几条注释即可:

第一个 User 表看起来更像是一个 Person 表,除了 auth 方法,但您可以将它放在 User_Password 表中,您可以将其重命名为 User。User_Metadata 表似乎可以与 User_Password/User 表合并。

现在,即使没有这些更改,您也拥有三个不同的表,具有三个不同的概念,如果您将每个单独的表建模为不同的类,然后将 UserModel 类作为各种外观来访问每个表,它可能会更容易.

于 2009-03-12T17:03:31.510 回答