0

我正在构建一个基于 codeigniter 的诊所管理/患者电子记录项目,我决定选择一个 orm,因为我的数据库之间有很多关系。

所以我下载了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?

帮助 ?!

4

2 回答 2

1

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

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

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

于 2013-02-23T20:13:32.597 回答
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 会自动添加它。

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

对于用户,您必须告诉它另一个表中的 FK 不是“visit_id”(这是默认值),而是“医生 ID”。

于 2013-04-11T10:37:09.673 回答