DataMapper ORM关系

时间:2013-01-28 14:06:49

标签: mysql database-design orm datamapper codeigniter-datamapper

table1(users)
|ID|name  |type  |
|1 |demo  |admin |
|2 |demoX |client|

table2(visits)
|ID|admin_id|visitor_id|visit_date|...
|1 |1       |2         |2013-01-01|...
admin(fk)->users(id)
user(fk)->users(id)

简单的调度程序项目,它包含2个表。

1st(用户)包含所有用户,2nd表包含所有预订(访问)。

获取管理员的所有预订我运行Select * from visits where admin_id=$id;,然后加入 来自用户表的访客信息。

........ 所以基本上,

每个管理员都可以有很多访问

访问必须包含(ONE)admin和(ONE)访问者。

我如何在datamapper orm中设置这种关系?

2 个答案:

答案 0 :(得分:0)

首先,我认为,您应该拥有一个包含admin_id和{{1}的单独表格,而不是使用包含user_idusers的表格(无效)然后表结构就是。

privileges

然后当您在应用程序中调用用户级别时:

Users privileges | id | user | privilege_id | | id | privilege | | 1 | user1 | 1 | | 1 | user | | 2 | admin1 | 2 | | 2 | admin | (MySQL)

为了这个目的,您应该SELECT privilege FROM privileges WHERE id = <privilege_id from users table which should already be set within your code>尝试在表格中设置ALWAYS,当您从另一个表中收集数据时,这将是您的关系数据的基础,因此在此示例中它将是id

从这里开始,您应该可以将此方法转移到Datamappercodeigniter或任何误导性标记的含义=]


如果您需要the <id> field of the privileges table and the <privilege_id> of the users table.从数据库进行预订,请选择SELECT(制作一张附加表并附加如下)并查找预订的时间booking将查找既有管理员又有用户的日期,而不仅仅是查看一个用户类型,而不是仅查看一个列,而不是几个。通过这种方式,您可以轻松管理表格,因为它们的名称与功能相关。

((privilage_id == 1) && (privilage_id == 2))

所以MySQL将 Users privileges booking | id | user | privilege_id | | id | privilege | | id | date | privilege_id | | 1 | user1 | 1 | | 1 | user | | 1 |5/2/13| 1 | | 2 | admin1 | 2 | | 2 | admin | | 2 |5/2/13| 2 | 这将为您提供您期望的结果,如果您需要清理数据以进入表格,那么您将需要在一个数据库中生成两行,这将是通过这样的程序完成(这个例子将使用一个假想的填充预订表格(并在PHP中完成)):

SELECT date FROM booking WHERE ((privilege_id == 1) && (privilege_id == 2))

还记得使用此方法,您需要从用户表中获取用户类型以获取if((isset($user) && (isset($usertype)) && (isset($usertypetwo)) && (isset($date))) { if(($usertype != $usertypetwo)) { "Insert BLAH BLAH" } }

答案 1 :(得分:0)

这应该这样做:

class Users extends Datamapper
{
    public $has_many = array(
        'admin' => array(
            'class' => 'users',
            'other_field' => 'admin', // FK = admin_id
        ),
        'visitor' => array(
            'class' => 'users',
            'other_field' => 'visitor', // FK = visitor_id
        ),
    );
}

class Visits extends Datamapper
{
    public $has_one = array(
        'admin' => array(
            'class' => 'users',
            'join_self_as' => 'admin', // FK = admin_id
        ),
        'visitor' => array(
            'class' => 'users',
            'join_self_as' => 'visitor', // FK = visitor_id
        ),
    );
}

// then in your controller you can do:

$visit = new Visitor(1);
echo $visit->admin->name; // echo's 'demo';
echo $visit->visitor->name; // echo's 'demoX';