Php codeigniter的数据映射器orm。关于加载时间和关系
我正在基于codeigniter构建一个诊所管理/患者电子记录项目,我决定使用orm,因为我的数据库之间有很多关系 所以我下载了DataMapper1.8.2并开始了一个新的codeigniter项目,我注意到的第一件事就是加载时间 codeigniter欢迎页面现在正在1sec++中加载!没有任何逻辑!这正常吗?这可以接受吗?通常ci在我的机器上的加载时间为0.002秒,但使用datamapper orm时,其最佳加载时间为1.06秒强> 第二个问题是关于关系 例如,我有两张桌子 表1用户。我过去常常把我所有的办公室ppl都存储起来,而且在那里我的角色 示例(用户) 第二个表是访问Php codeigniter的数据映射器orm。关于加载时间和关系,php,codeigniter,codeigniter-datamapper,Php,Codeigniter,Codeigniter Datamapper,我正在基于codeigniter构建一个诊所管理/患者电子记录项目,我决定使用orm,因为我的数据库之间有很多关系 所以我下载了DataMapper1.8.2并开始了一个新的codeigniter项目,我注意到的第一件事就是加载时间 codeigniter欢迎页面现在正在1sec++中加载!没有任何逻辑!这正常吗?这可以接受吗?通常ci在我的机器上的加载时间为0.002秒,但使用datamapper orm时,其最佳加载时间为1.06秒 第二个问题是关于关系 例如,我有两张桌子 表1用户。我过去
|id|doctor_id|patient_id|.....
|1 |2 |4 |......
那么我如何设置它,以便datamapper能够理解用户中的每个用户都有一个角色,并且表访问有一个(医生,病人)
,用户(医生,病人)有多个(访问)
?
由于每次就诊必须只有一名医生和一名患者,但每个患者/医生可以有多次就诊
当前设置试验
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();
使用者
但是当我试图通过
$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比most更高效,尽可能使用联接而不是多个查询 要查看Datamapper生成的查询,请启用CI的探查器。您将很快看到您的代码是否高效,或者如果您运行了更多的查询,那么您必须这样做
是否启用了生产缓存?否则,Datamapper将为您加载的每个模型、每个页面请求运行一个描述表。虽然这在开发中是可以的(当您的表结构仍然发生变化时),但在生产中这不是一个好主意,并且可能会占用大部分时间。您的关系定义不正确:
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”,对于“医生”关系,哪个FK将是“医生id”,对于“患者”关系,哪个FK将是“患者id”
对于用户,您必须告诉它另一个表中的FK不是“就诊id”(这将是默认值),而是“医生id”。关于缓慢加载时间:是的,ORM会减慢系统速度。这意味着作为开发人员,您的工作更容易处理复杂的数据库。为了更快的开发,您牺牲了加载时间。如果它是不可忍受的,考虑使用活动记录或升级您的系统。嗯,是的,我有我的剖析器,你是对的,它确实运行了描述表每次,我不知道它与生产缓存选项有关。谢谢,我会这么做的,但我很难弄清楚与datamapper的内部关系。你能回答我问题中提到的这个关系问题吗?
DataMapper Error: 'doctor_id' is not a valid parent relationship for Visit. Are your relationships configured correctly?
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',
)
);