2011-10-23 26 views
0

不确定我是否最近在stackoverflow上问了太多问题,但我觉得Zend Framework文档是令人震惊的。看起来这些例子非常模糊,并不像真实世界中使用的那样。他们鼓励使用框架整理和组织代码,然后不提如何应该遵循:D使用Zend_Model_Mappers和Zend_Db_Table_Abstract的单个模型的多个表格

所以无论如何!在我目前对面的Zend迁移旧的应用程序,我有一个叫做功能寄存器,如:

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,它将对象写入数据库,但事情是,其中一些用户片段进入用户配置文件表。在留言板应用程序的例子是,内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); 

但是,这似乎只是一个位哈克。处理多个表的实际推荐方式是什么?

此外,如果我有自定义查询...我是否打算将它们放入创建的DbTable类或UserMapper类中?我并没有真正看到扩展DbTable的实际用途。所有的指南都说要做到这一点,它并没有真正解释为什么你这样做的好处/原因/用途。

感谢,大教堂

+0

[“青睐 '的对象组成' 过'类继承'。“ (四人帮1995:20)](http://en.wikipedia.org/wiki/Design_Patterns) – vascowhite

+0

所以我猜你的意思,而不是让用户 - >保存()只抓住和处理一个DbTable用户',它应该在一个函数中使用多个表?所以我做我说的话感觉有点乱。设置dbtable('user')并更新它,然后设置dbtable('userprofile')并执行任务 –

+0

你对自定义查询做了什么样的事情? – ChrisA

回答

1

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

您的用户映射程序类可能有$user$userProfile属性和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); 
    } 
} 
+0

很酷,谢谢你。我创建了一个新的实例来代替Application_Model_DBTable。这是否涵盖我的交易查询等?我花了很多时间在我的旧应用程序中,确保所有的工作都像这样,并且如果不是这样,我觉得我在回溯:/ –

+0

[看看这个](http://framework.zend.com/manual/) 1.11/EN/zend.db.adapter.html#zend.db.adapter.transactions) – vascowhite

0

你的映射器类需要跟多个表,所以你需要多套/ getDbTable方法,例如:

public function setUserDbTable($dbTable) {}  
public function getUserDbTable() {} 

public function setUserProfileDbTable($dbTable) {}  
public function getUserProfileDbTable() {} 

然后在你的其他的方法,你可以使用适当的表,例如:

$this->getUserDbTable()->insert($userData); 
$this->getUserProfileDbTable()->insert($userProfileData); 

而其他方法中的其他相互作用类似。