不确定我最近是否在stackoverflow上问了太多问题,但我觉得Zend Framework文档令人震惊。看起来这些例子非常模糊,与现实世界中使用的一样。他们鼓励使用框架来整理和组织代码,然后不提及应如何遵循它:D
无论如何!在我正在迁移到Zend的旧应用程序中,我有一个名为register的函数:
function register($username, $password, $email, $etc) {
// Do stuff
// Insert $email and other stuff into `user_profile` table
// Insert $username and $password into the `user` table
}
但现在有了Zend ......我一直在关注他们的入门指南,我有以下模型:User
,UserMapper
。
我的数据库中的每个表都有DbTables,如:User
,UserProfile
。
所以我喜欢你注册时的功能,你建立一个User对象,然后在mapper上调用save
,它将对象写入数据库,但问题是,其中一些用户进入了用户配置文件表。留言簿应用程序中的示例是,在UserMapper中,您只需拉入一个表(用户)并写入...我的意思是我可以做类似的事情:
// Insert or Update data to user table
$this->getDbTable()->insert($user_data);
// Insert or Update User Profile data
$this->setDbTable('UserProfile');
$this->getDbTable()->insert($user_profile);
但这似乎有点...... hacky。处理多个表的实际推荐方法是什么?
另外,如果我有自定义查询...我是否打算将它们放入创建的DbTable
类或UserMapper
类中?我真的没看到扩展DbTable实际上是为了什么。所有指南都说要做到这一点并没有真正解释为什么你这样做的好处/原因/用途。
谢谢,Dom
答案 0 :(得分:1)
首先,你不能在SO上问太多问题。那是网站存在的,没有问题=没有答案=没有。 :)
您的usermapper类可以包含$user
和$userProfile
属性以及register()
方法。然后,register方法从这些表中访问所需的方法。下面的示例代码是基本的,不会按原样运行,但它为您提供了一般的想法。
它不是继承一个类的属性和方法,而是使用组合来访问多个类。换句话说,这个类'有'Zend_Db_Tables而不是'是'Zend_Db_Table。希望差异很明显,你可以看到以这种方式工作的一些优势。
在您的控制器中: -
public function indexAction() {
$userMapper = new Application_Model_Usermapper();
$userMapper->register($username, $password, $email, $etc);
}
在你的模型中(我还没有使用名称间距,抱歉): -
class Application_Model_Usermapper
{
private $user;
private $userProfile;
public function __construct()
{
$config = array(
'name' => 'userTable',
'primary' => 'userid'
);
$this->user = new Zend_Db_Table($config);
$config = array(
'name' => 'userProfileTable',
'primary' => 'userid'
);
$this->userProfile = new Zend_Db_Table($config);
}
public function register($username, $password, $email, $etc)
{
$this->user->insert($userdata);
$this->userProfile->insert($userProfileData);
}
}
答案 1 :(得分:0)
您的Mapper类需要与多个表对话,因此您需要多个set / getDbTable方法,例如:
public function setUserDbTable($dbTable) {}
public function getUserDbTable() {}
public function setUserProfileDbTable($dbTable) {}
public function getUserProfileDbTable() {}
然后在您的其他方法中,您可以使用适当的表格,例如:
$this->getUserDbTable()->insert($userData);
$this->getUserProfileDbTable()->insert($userProfileData);
与其他方法中的其他相互作用相似。