Php 使用Zend_Model_映射器和Zend_Db_Table_Abstract为单个模型创建多个表

Php 使用Zend_Model_映射器和Zend_Db_Table_Abstract为单个模型创建多个表,php,model-view-controller,zend-framework,zend-db,Php,Model View Controller,Zend Framework,Zend Db,我不确定我最近是否问了太多关于stackoverflow的问题,但我觉得Zend框架文档令人震惊。这些例子似乎非常模糊,与现实世界中使用的完全不同。他们鼓励使用框架来构建整洁有序的代码,但没有提到应该如何遵循:D 不管怎样!在我当前迁移到Zend的旧应用程序中,我有一个名为register的函数,类似于: function register($username, $password, $email, $etc) { // Do stuff // Insert $email and

我不确定我最近是否问了太多关于stackoverflow的问题,但我觉得Zend框架文档令人震惊。这些例子似乎非常模糊,与现实世界中使用的完全不同。他们鼓励使用框架来构建整洁有序的代码,但没有提到应该如何遵循: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

因此,我喜欢这样的功能:注册时,构建一个用户对象,然后在映射器上调用
save
,该映射器将对象写入数据库,但问题是,一些用户片段进入用户配置文件表。guestbook应用程序中的示例是,在UserMapper中,您只需拉入一个表(User)并写入该表。。。我的意思是我可以做一些事情,比如:

// 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);
但这似乎有点。。哈奇。处理多个表的实际推荐方法是什么

另外,如果我有自定义查询。。。我是要将它们放入已创建的
DbTable
类还是
UserMapper
类?我并没有真正了解扩展DbTable的实际用途。指南上说的只是去做,但它并没有真正解释你为什么这么做的好处/原因/用途


谢谢,Dom

您的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);

和其他方法中的其他交互类似。

首先,你不能问太多问题。这就是网站存在的目的,没有问题=没有答案=没有答案。:)

usermapper类可以有
$user
$userProfile
属性和
register()
方法。然后,register方法从这些表中访问它需要的方法。下面的示例代码是基本的,不会按原样工作,但它给出了一般的想法

它使用组合来访问多个类,而不是继承一个类的属性和方法。换句话说,这个类“有”Zend_Db_表,而不是“有”Zend_Db_表。希望差别是明显的,你可以看到这种方式的一些优势

在控制器中:-

public function indexAction() {
    $userMapper = new Application_Model_Usermapper();
    $userMapper->register($username, $password, $email, $etc);
}
在您的模型中(对不起,我还没有时间使用名称间距):-


我猜你的意思是,与其让User->save()只抓取和处理一个DbTable“User”,不如让它在一个函数中使用多个表?所以我照我说的做,感觉有点不舒服。设置dbtable('user')并对其进行更新,然后设置dbtable('userprofile')并进行填充您对自定义查询做了哪些操作?很酷,谢谢。我创建了应用程序的新实例,而不是我创建的模型。这是否包括我的事务查询等?我花了很多时间在我的旧应用程序中,确保一切都是这样工作的,如果不这样做,我会觉得自己在倒退:/
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);
    }  
}