codeigniter的datamapper orm。关于加载时间和关系

时间:2013-02-21 16:40:45

标签: php codeigniter codeigniter-datamapper

我正在建立一个基于codeigniter的诊所管理/病人电子记录项目,我决定去找一个人,因为我的数据库之间有很多关系。

所以我下载了datamapper 1.8.2并启动了一个新的codeigniter项目,我注意到的第一件事就是加载时间!

codeigniter欢迎页面现在以1秒++加载!没有任何逻辑!这是正常的吗?这是可以接受的吗?通常ci在我的机器上加载0.002秒,但 datamapper orm最好是1.06!

问题是关于关系。

我有2个表格,例如

表1用户。我用来存储我所有的办公室人员,并有角色

实施例(用户)

|ID|name|role   |
|1 |Demo|admin  |
|2 |Demo|doctor |
|3 |Demo|nurse  |
|4 |Demo|patient|

第二张表是访问

|id|doctor_id|patient_id|.....
|1 |2        |4         |......

所以如何设置这个,以便datamapper能够理解用户中的每个用户都有一个角色,该表访问has_one(doctors,patient)和用户(医生,患者)has_many(visits)? 因为每次访问必须只有一名医生和患者,但每位患者/医生都可以多次访问。

当前设置试用

class Visit extends DataMapper {
    var $has_one = array(
        'doctor' => array(
            'class' => 'user',
            'join_self_as' => 'doctor_id',
            'other_field' => 'visit'
        ),
        'patient' => array(
            'class' => 'user',
            'join_self_as' => 'patient_id',
            'other_field' => 'visit'
        )
    );
    var $has_many = array();

用户

class User extends DataMapper {
    var $has_one = array();
    var $has_many = array(
        'visit' => array(
            'class' => 'visit',
            'other_field' => 'doctor_id',
            'join_self_as' => 'doctor_id',
        )
    );

但是当我尝试通过

访问医生时
$u=new user(2);
$u->visit->get();

它给我错误

DataMapper Error: 'doctor_id' is not a valid parent relationship for Visit. Are your relationships configured correctly?

帮助?!

2 个答案:

答案 0 :(得分:1)

无论是否使用ORM,您作为开发人员始终必须了解您使用的工具,在这种情况下,您编写的代码会生成在您的数据库中触发的查询。随着查询的进行,Datamapper比大多数更有效,在可能的情况下使用连接而不是多个查询。

要查看Datamapper生成的查询,请启用CI的分析器。您将很快看到您的代码是否有效,或者如果您运行更多查询,则必须这样做。

您是否启用了生产缓存?如果没有,Datamapper将为您加载的每个模型,每个页面请求运行DESCRIBE TABLE。虽然这在开发中是可以的(当你的表结构仍然改变时),但这在生产中并不是一个好主意,并且很可能占据了大部分时间。

答案 1 :(得分:0)

您的关系未正确定义:

class Visit extends DataMapper {
    var $has_one = array(
        'doctor' => array(
            'class' => 'user',
            'join_self_as' => 'doctor',
        ),
        'patient' => array(
            'class' => 'user',
            'join_self_as' => 'patient',
        )
    );


class User extends DataMapper {
    var $has_many = array(
        'visit' => array(
            'join_other_as' => 'doctor',
        )
    );

您只需覆盖非默认值,Datamapper将填写其余值。另外,不要使用'_id'后缀,这是强制性的,Datamapper会自动添加它。

对于Visit,您必须指定在关系中使用哪个FK来表示它自己的'id',对于'doctor'关系将是'doctor_id',对于'patient'关系将是'patient_id'。< / p>

对于用户,您必须告诉它其他表中的FK不是'visit_id'(这是默认值),而是'doctor_id'。