繁体   English   中英

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

[英]datamapper orm for codeigniter. about loading time and relations

我当时正在基于Codeigniter建立一个诊所管理/患者电子记录项目,由于我的数据库之间存在很多关系,所以我决定去参加Orm。

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

codeigniter欢迎页面现在以1秒++的速度加载! 没有任何逻辑呢! 这正常吗? 可以接受吗? 通常ci在我的机器上以0.002秒的速度加载,但使用datamapper或其最佳值为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         |......

所以我该如何设置它,以便数据映射器可以理解用户中的每个用户都有其角色,并且表访问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?

救命 ?!

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

要查看Datamapper生成的查询,请启用CI的探查器。 您将快速查看您的代码是否有效,或者是否需要运行更多查询。

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

您的人际关系定义不正确:

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_id”,对于“病人”关系,将为“ Patient_id”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM