我正在构建一个基于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"。