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页面。但是我当然会使用延迟加载。
答
Zend_Db_Table类内置了这个功能! :)
它采用“dependentTables”和“referenceMap”管理表的关系自身的概念,甚至可以做CASCADE和删除任何东西给你,如果你的数据库不支持参照约束
所以你可以分配页面和标签(或者在我的例子中的用户和组)来分别标记和页面?,并传递数组中的类名来延迟加载标签/页面对象? 使用包含标签/页面对象的集合对象有什么问题? – 2009-09-25 08:03:03
当然,你可以使用集合... :)它是完全一样的 - 我只是习惯这样做,sry ...问题是你可以进入无限循环(为页面加载标签每个页面对象需要标签,它们被加载并且每个标签都有页面,加载页面...),这就是为什么需要延迟加载。此外,我会建议使用某种缓存来存储结果,因为它可能会得到相当密集的数据库:) – 2009-09-25 12:47:57