ActiveRecord和多对多的关系?

问题描述:

我正在尝试将活动记录模式实现为ZF项目。 我曾经与之前的类似工作合作过,效果很好。ActiveRecord和多对多的关系?

但现在我的问题,是关于如何处理多到很多与我的模型关系。

下面是一个例子:

比方说,我的用户模型。

<?php 
require_once 'MLO/Model/Model.php'; 

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'email' => NULL, 
     'password' => NULL, 
    ); 
} 

没问题。

但是如果我添加组模型?

require_once 'MLO/Model/Model.php'; 

class Model_Group extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
    ); 
} 

require_once 'MLO/Model/Collection.php'; 

class Model_Groups extends MLO_Model_Collection 
{ 
    protected $_modelClass = 'Model_Group'; 
} 

我然后映射器,其转换结果从DB来建模对象,反之亦然。

我的问题是,如何处理多到很多与我的模型的关系?

我应该在哪里“保存关系”?

下面是一些线索,我想:

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
     'groups' => NULL, // where groups will be an instance of the Model_Groups 
    ); 
} 

用同样的方法,其中基团会像一个数组:

array(3) { 
    [0]=> 
    array(3) { 
    ["id"]=> 
    string(1) "9" 
    ["name"]=> 
    string(1) "Guest" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [1]=> 
    array(3) { 
    ["id"]=> 
    string(1) "64" 
    ["name"]=> 
    string(1) "Moderator" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [2]=> 
    array(3) { 
    ["id"]=> 
    string(1) "5" 
    ["name"]=> 
    string(1) "Admin" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
} 

另一个想法?

P.S:我并不想处理ACL或类似的东西,它只是一个例子。

让我们翻译您的问题张贴标签 - 一个职位有多个标签,一个标签使用的许多职位 - 这是很容易理解的(至少对我来说):

我会[“标签”]添加到页面的$ _data,正如你所建议的那样。它将是一系列被吸引的标签对象。 Analogicaly for Tag我会添加['网页']与Adjected页面。但是我当然会使用延迟加载。

+0

所以你可以分配页面和标签(或者在我的例子中的用户和组)来分别标记和页面?,并传递数组中的类名来延迟加载标签/页面对象? 使用包含标签/页面对象的集合对象有什么问题? – 2009-09-25 08:03:03

+0

当然,你可以使用集合... :)它是完全一样的 - 我只是习惯这样做,sry ...问题是你可以进入无限循环(为页面加载标签每个页面对象需要标签,它们被加载并且每个标签都有页面,加载页面...),这就是为什么需要延迟加载。此外,我会建议使用某种缓存来存储结果,因为它可能会得到相当密集的数据库:) – 2009-09-25 12:47:57

Zend_Db_Table类内置了这个功能! :)

它采用“dependentTables”和“referenceMap”管理表的关系自身的概念,甚至可以做CASCADE和删除任何东西给你,如果你的数据库不支持参照约束

Zend_Db_Table Relationships