我正在建立一个基于codeigniter的诊所管理/病人电子记录项目,我决定去找一个人,因为我的数据库之间有很多关系。
所以我下载了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?
帮助?!
答案 0 :(得分:1)
无论是否使用ORM,您作为开发人员始终必须了解您使用的工具,在这种情况下,您编写的代码会生成在您的数据库中触发的查询。随着查询的进行,Datamapper比大多数更有效,在可能的情况下使用连接而不是多个查询。
要查看Datamapper生成的查询,请启用CI的分析器。您将很快看到您的代码是否有效,或者如果您运行更多查询,则必须这样做。
您是否启用了生产缓存?如果没有,Datamapper将为您加载的每个模型,每个页面请求运行DESCRIBE TABLE。虽然这在开发中是可以的(当你的表结构仍然改变时),但这在生产中并不是一个好主意,并且很可能占据了大部分时间。
答案 1 :(得分: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会自动添加它。
对于Visit,您必须指定在关系中使用哪个FK来表示它自己的'id',对于'doctor'关系将是'doctor_id',对于'patient'关系将是'patient_id'。< / p>
对于用户,您必须告诉它其他表中的FK不是'visit_id'(这是默认值),而是'doctor_id'。