【问题标题】:datamapper orm for codeigniter. about loading time and relations用于 codeigniter 的 datamapper orm。关于加载时间和关系
【发布时间】:2013-02-21 16:40:45
【问题描述】:

我正在构建一个基于 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 了解 users 中的每个用户都有一个角色,并且该表访问 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 会减慢您的系统速度。它旨在使您作为开发人员的工作更容易处理复杂的数据库。您牺牲加载时间来加快开发速度。如果无法忍受,请考虑使用 Active Record 或升级您的系统。

标签: php codeigniter codeigniter-datamapper


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,是的,我打开了探查器,你是对的,它确实每次都运行描述表,我不知道它与生产缓存选项有关。谢谢会这样做
  • 但我也很难弄清楚与 datamapper 的内部关系你能回答我的问题中提到的这个关系问题吗?
【解决方案2】:

你的关系定义不正确:

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_id',对于 '患者' 关系将是 'patient_id'。

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

【讨论】:

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