[英]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.