2011-11-09 59 views
1

我正在運行在線食品日記,用戶可以在其中記錄日記帳分錄。有四種類型的條目:食物條目,練習條目,測量和已完成的任務。條目有幾個共同的屬性(例如,id,amount,unit_id等),但它們也具有類型特定的屬性(例如,food_id,exercise_id等)。這是超級和子類型關係的完美選擇。如何在CodeIgnitor的DataMapper ORM中設置超類型和子類型關係?

這裏是我的表(簡體):

CREATE TABLE entries 
`id` int 
`user_id` int 
`created` datetime 
`entered` datetime 
`amount` float 
`unit_id` int 
PRIMARY KEY id 

CREATE TABLE exercise_entries 
`entry_id` int 
`exercise_id` int 
PRIMARY KEY entry_id 

CREATE TABLE food_entries 
`entry_id` int 
`food_id` int 
PRIMARY KEY entry_id 

所以我的問題是,我該如何設置超和子類型關係使用CodeIgniter的ORM的DataMapper?我查看了User Guide's Relationships和Advanced Relationships部分,但找不到任何東西。

如果這是不可能的DataMapper,我能想到的幾個解決方案:

  1. 滾子類型屬性了(1個大表,啊)
  2. 卷的超類型的屬性下降(4個獨立表啊)
  3. 去核,並使用Doctrine ORM 2.0(YAML配置文件,唉!)
  4. 使用不同的框架,其原生ORM支持表繼承(我入圍的Kohana和FuelPHP使用CodeIgniter)。
  5. 手動編碼超類型和子類型關係(首先破壞了ORM的用途)。

我對我的任何選擇都不感到激動。選項1和2會產生他們自己的頭痛(請參閱this article的底部)。選項3看起來像用大錘手術。我對Option 4很開放,因爲我還沒有開始編寫任何框架代碼(這是CI和Kohana之間的一個非常艱難的選擇)。選項5是我現在的位置。

有什麼建議嗎?謝謝您的幫助!

回答

0

我還沒有嘗試過使用DataMapper,但可以嘗試(確保調用父構造函數以及所有這些)。我會假設,Exerciseentry將繼承所有的從條目的屬性/方法 - 但不能肯定是否會DataMapper的這種方式處理:

class Entry extends DataMapper { 

} 

// you may have to explicitly include Entry.php in this file: 
class Exerciseentry extends Entry { 

} 

如果不工作,你基本上可以創建兩個對象是相關(不是真正的純面向對象的原則,但會完成這項工作):

class Entry extends DataMapper { 
    // ... some stuff 

    var $has_many = array('exerciseentry', 'foodentry'); 

    // ... some more stuff 
} 

class Exerciseentry extends DataMapper { 
    // ... some stuff 

    var $has_one = array('entry'); 

    // ... some more stuff 
} 

class Foodentry extends DataMapper { 
    // ... some stuff 

    var $has_one = array('entry'); 

    // ... some more stuff 
} 

// then when you get an entry, you'd do this 
$my_exercise_entry = new Exerciseentry(1); 
$my_exercise_entry->include_related('entry', array('user_id', 'amount', 'unit_id'); 
$my_exercise_entry->get(); 

echo 'Amount is: ' . $my_exercise_entry->entry_amount; 
// etc 
+0

感謝Swatkins,我也貼了問題(以稍微不同的形式)在[CodeIgnitor論壇](http://codeigniter.com/ forums/viewthread/203944 /)和維護DataMapper ORM庫的WanWizard做出了迴應。爲了解釋,我不能按原樣使用超級/子類型關係。我需要改變我的表格。 WRT擴展了一個Entry基類,我認爲這在目前的版本中是不可能的(參見[Issue#61](https://bitbucket.org/wanwizard/datamapper/issue/61/datamapper-class-can-not) -be擴展))。看起來我必須畢竟使用Doctrine。噓。謝謝您的幫助! –

+0

嗯,我無法贊成你,因爲我沒有任何SO-cred,但你關於兩個獨立對象的第二個建議是解決方案。謝謝您的幫助。 –