Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php codeigniter的数据映射器orm。关于加载时间和关系_Php_Codeigniter_Codeigniter Datamapper - Fatal编程技术网

Php codeigniter的数据映射器orm。关于加载时间和关系

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用户。我过去

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

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

codeigniter欢迎页面现在正在1sec++中加载!没有任何逻辑!这正常吗?这可以接受吗?通常ci在我的机器上的加载时间为0.002秒,但使用datamapper orm时,其最佳加载时间为1.06秒

第二个问题是关于关系

例如,我有两张桌子

表1用户。我过去常常把我所有的办公室ppl都存储起来,而且在那里我的角色

示例(用户)

第二个表是访问

|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',
        )
    );