【问题标题】:Multiple M2M in DataMapper ORM issueDataMapper ORM问题中的多个M2M
【发布时间】:2014-01-15 20:55:26
【问题描述】:

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

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

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

这是我的模型规则

用户角色

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

用户权限

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 表中有两个条目,其中一个条目的dm_entity_id 为空,另一个为userrole_id 为空。

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

有谁知道我怎样才能让它工作,以便它输入一个正确的条目,而不是两个分散的条目?

【问题讨论】:

    标签: php orm codeigniter-2 codeigniter-datamapper


    【解决方案1】:

    这是行不通的(你已经注意到了)。

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

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

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

    【讨论】:

    • 想了很多。感谢你的回答。想我会回到那个:)
    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2011-10-13
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多