2013-02-21 63 views
0

我正在建立一個基於codeigniter的診所管理/病人電子記錄項目,我決定去一個orm,因爲我的db之間有很多關係。datamapper orm for codeigniter。關於加載時間和關係

所以我下載了datamapper 1.8.2並開始新的codeigniter項目,我注意到的第一件事是加載時間!

codeigniter歡迎頁面現在正以1seC++加載!沒有任何邏輯!這是正常的嗎?這是可以接受的嗎?通常ci會在我的機器上加載0.002秒,但是datamapper orm其1.06最好!

secound問題是關於關係。

我有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

關於緩慢的加載時間:是的,一個ORM會減慢您的系統。它的目的是使您作爲開發人員的工作更容易處理複雜的數據庫。你犧牲加載時間來加快開發速度。如果無法忍受,請考慮使用Active Record或升級您的系統。 – 2013-02-21 17:54:20

回答

1

無論是否有ORM,您作爲開發人員都必須瞭解您使用的工具,在這種情況下,您編寫的用於生成查詢的代碼將觸發您的數據庫。隨着查詢的進行,Datamapper會比大多數效率更高,在可能的情況下使用連接而不是多個查詢。

要查看Datamapper生成的查詢,請啓用CI的分析器。你會很快看到你的代碼是否有效,或者如果你運行更多的查詢,那麼你必須。

您是否啓用了生產緩存?如果沒有,Datamapper將針對您加載的每個模型(每個頁面請求)運行一個DESCRIBE TABLE。雖然在開發過程中這是可以的(當你的表格結構仍然改變時),但這不是生產中的一個好主意,並且可能佔了很大一部分時間。

+0

嗯,是的,我有我的分析器,你是對的,它每次都運行描述表,我不知道它與生產緩存選項有關。謝謝你會這樣做 – Zalaboza 2013-02-23 20:17:59

+0

,但即時通訊真的很難找出與datamapper的內部關係,你可以請回答我的問題中提到的這種關係問題? – Zalaboza 2013-02-23 20:19:38

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會自動添加它。

對於訪問,您必須指定在關係中使用哪個FK來表示它自己的'id',其中'doctor_id'表示'doctor'關係,'patient_id'表示'patient'關係。

對於用戶,您必須告訴它,另一個表中的FK不是'visit_id'(這將是默認值),而是'doctor_id'。