2011-11-09 10 views
1

私は、ユーザーがジャーナルエントリを記録できるオンラインフードジャーナルを運営しています。入力項目には、食糧項目、運動項目、測定値、完了したタスクの4種類があります。エントリには複数の属性(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のDataMapperのORMを使用して、サブタイプ関係行う方法、ありますか?私はUser Guide's Relationshipsと高度な関係のセクションを見ましたが、何も見つかりません。

それはDataMapperのでは可能ではない場合、私はいくつかの解決策を考えることができますが:サブタイプがアップ属性

  1. ロール(1つの大きなテーブル、ぐふ)
  2. ロールスーパータイプがダウン属性(4別々テーブル、ぐふ)
  3. 囲碁核とDoctrine 2.0 ORM(YAML設定ファイル、ぐふを使用!)
  4. は母国ORM(私はCodeIgniterのでのKohanaとFuelPHPを選考)テーブル継承をサポートする別のフレームワークを使用してください。
  5. スーパータイプとサブタイプの関係を手動で記述します(最初はORMの目的に反する)。

私の選択肢には驚きません。オプション1と2は自分自身の頭痛を作ります(this articleの下部を参照)。オプション3は、ハンマーハンマーで手術のようです。私はオプション4を公開しています。なぜなら、私はフレームワークコードを書くことを始めていないからです(これはCIとKohanaの間では本当に厳しい選択でした)。オプション5は今私がいる場所です。

提案がありますか?助けてくれてありがとう!

答えて

0

私はこれをDataMapperで試していませんが、親コンストラクタとそのすべてを呼び出すようにしてください。私はExerciseentryは、エントリからのプロパティ/メソッドのすべてを継承することを前提としています - データマッパーはそれをこのように扱うかどうわからなく:

class Entry extends DataMapper { 

} 

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

} 

問題が解決しない場合は、基本的に関連している2つのオブジェクトを作成することができます(本当に純粋なOOPの原則が、仕事を得るでしょう):

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-extended))。結局私はDoctrineを使う必要があるようです。ブー。助けてくれてありがとう! –

+0

私はSO-credを持っていないので、私はあなたにアップアップすることはできませんが、2つの別々のオブジェクトを関連付けるという2番目の提案が解決策です。助けてくれてありがとう。 –

関連する問題