DataMapper ORM问题中的多个M2M

时间:2014-01-15 20:55:26

标签: php orm codeigniter-2 codeigniter-datamapper

我正在为CodeIgniter中的DataMapper ORM库构建一个小核心部分,以控制用户对DataMapper对象本身的访问/编辑权限(CRUD)。为此,我想将DataMapper EntityUserroleUserright链接在一起。

文档在这里http://datamapper.wanwizard.eu/pages/advancedrelations.html(在头下; 多表关系)。

因此,如果我手动填写连接表,我可以毫无问题地获取值。唯一的问题是保存关系。

以下是我的模型规则

的UserRole

var $has_many = array(
    'userright' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
    'dm_entity' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
);

Userright

var $has_many = array(
    'dm_entity' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
    'userrole' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
);

Dm_entity

var $has_many = array(
    'userrole' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
    'userright' => array(
        'join_table' => 'dm_entities_userrights_userroles',
    ),
);

我似乎很奇怪地经常两次宣布这张桌子,但是如果我不这样做的话似乎没有用。

因此,这个关系的检索代码构成了Userright;

的视角
$userrole = new Userrole;
$userrole->get_where(array('name' => 'Administrator'));

$dm_entity = new Dm_entity;
$dm_entity->get_where(array('name' => 'User'));     

$userrights = new Userright;
$userrights->where_related($userrole);
$userrights->where_related($dm_entity)->get();

$output = '';

foreach ($userrights as $userright) {
    $output .= '<i><b>'.$userright->name.'</b></i> and ';
}

$output = substr($output, 0, -5);

echo '<b>'.$userrole->name.'</b> has the right to '.$output.' the DataMapper entity <b>'.$dm_entity->name.'</b>.'.br();

所以这也没有任何问题。但现在节约的部分:

$new_userright = new Userright;
$new_userright->get_where(array('name' => 'Update'));

$new_userright->save(array($userrole, $dm_entity));

这导致dm_entities_userrights_userroles表中的两个条目,其中1个条目为dm_entity_id为空,另一个为userrole_id为空。

我希望避免为连接表创建一个单独的模型来解决这个问题。

有谁知道我怎么能让它工作,所以它是一个正确的条目,而不是两个分散的条目?

1 个答案:

答案 0 :(得分:2)

这不起作用(你已经注意到了)。

两个模型之间存在关系,对于每个“多对多”关系,您需要一个单独的连接表。

虽然从技术上讲,你可以创建一个包含10个FK到10个不同模型的连接表,但Datamapper不会意识到这一点,并且会将每个关系的表视为不同,从而导致重复出现。

使这项工作的唯一方法是为连接表定义一个模型,并为每个其他模型提供一对多的关系。然后,您可以使用该模型通过分配或更新FK值手动添加关系,并仍然使用多对多关系进行检索和更新。