0
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 个表。

第一个(用户)包含所有用户,第二个表包含所有预订(访问)。

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

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

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

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

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

4

2 回答 2

0

首先,我认为,与其有一个带有admin_idand的表user_id(没有帮助),你应该有一个带有usersand的单独表privileges,然后表结构就是。

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

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

SELECT privilege FROM privileges WHERE id = <privilege_id from users table which should already be set within your code>(MySQL)

为此,您应该ALWAYS尝试在您的表中设置's,这将是您从另一个表中收集数据时关系数据的基础,因此在此示例中它将是idthe <id> field of the privileges table and the <privilege_id> of the users table.

从这里你应该能够将此方法转移到Datamappercodeigniter或任何你的误导性标签的意思 =]


如果您需要SELECT从数据库中进行预订,请选择booking(制作一个额外的表格并附加如下)并查找预订的时间,((privilage_id == 1) && (privilage_id == 2))这将查找同时存在管理员和用户的日期,而不仅仅是查看一种用户类型,您正在查看所有用户类型,并且通过调用一列而不是多列来为自己节省一些麻烦。也通过这种方式,您可以轻松管理您的表格,因为它们的名称与功能相关。

         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         | 

所以 MySQL 会SELECT date FROM booking WHERE ((privilege_id == 1) && (privilege_id == 2))这样会给你你期望的结果,如果你需要清理你的数据以进入表,那么你需要在一个数据库中创建两行,这将通过这样的过程完成(这个示例将使用一个虚构的填写预订表格(并在 PHP 中完成)):

if((isset($user) && (isset($usertype)) && (isset($usertypetwo)) && (isset($date)))
{
    if(($usertype != $usertypetwo))
     {
      "Insert BLAH BLAH"
     }
}

还记得使用此方法,您需要从用户表中获取用户类型以获取privilege_id

于 2013-02-05T11:04:34.897 回答
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';
于 2013-02-07T20:48:46.343 回答