【问题标题】:DataMapper ORM relationshipsDataMapper ORM 关系
【发布时间】:2013-01-11 21:29:48
【问题描述】:
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;,然后加入 来自用户表的访问者信息。

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

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

visit 必须包含 (ONE)admin 和 (ONE)visitor。

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

【问题讨论】:

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


    【解决方案1】:

    应该这样做:

    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';
    

    【讨论】:

      【解决方案2】:

      首先我认为,与其有一个带有admin_iduser_id 的表(没有帮助),你应该有一个带有usersprivileges 的单独表,那么表结构将是.

          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 尝试为此在您的表中设置id,这将是您从另一个表收集数据时关系数据的基础,因此在本例中它将是the <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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        相关资源
        最近更新 更多