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


datamapper orm for codeigniter. about loading time and relations

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

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

codeigniter欢迎页面现在正在加载1秒++!还没有任何逻辑!这正常吗?它可以接受吗?在我的机器上,ci通常在0.002秒内加载,但使用数据映射程序时,它的最佳版本是1.06

第二个问题是关于关系。

我有两张桌子,例如

表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"后缀,这是必需的,Datamapp将自动添加它。

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

对于User,您必须告诉它另一个表中的FK不是"visit_id"(这将是默认值),而是"doctor_id"。