1

私は、ユーザーがジャーナルエントリを記録できるオンラインフードジャーナルを運営しています。エントリには、食品エントリ、運動エントリ、測定値、および完了したタスクの4つのタイプがあります。エントリには、共通のいくつかの属性(たとえば、id、amount、unit_idなど)がありますが、タイプ固有の属性(たとえば、food_id、exercise_idなど)もあります。これは、スーパータイプとサブタイプの関係に最適な候補です。

これが私のテーブルです(簡略化):

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を使用してスーパータイプとサブタイプの関係を設定するにはどうすればよいですか?ユーザーガイドの「関係」セクションと「高度な関係」セクションを見ましたが、何も見つかりません。

DataMapperでそれが不可能な場合は、いくつかの解決策を考えることができます。

  1. サブタイプ属性をロールアップします(1つの大きなテーブル、ugh)
  2. スーパータイプの属性をロールダウンします(4つの別々のテーブル、ugh)
  3. 核になり、Doctrine 2.0 ORMを使用します(YAML構成ファイル、うーん!)
  4. ネイティブORMがテーブル継承をサポートする別のフレームワークを使用します(CodeIgniterでKohanaとFuelPHPを候補リストに追加しました)。
  5. スーパータイプとサブタイプの関係を手動でコーディングします(そもそもORMの目的を無効にします)。

私は自分の選択肢のどれにもわくわくしていません。オプション1と2は、独自の頭痛の種になります(この記事の下部を参照)。オプション3は、ハンマーを使った手術のようです。フレームワークコードを書き始めていないので、オプション4を使用できます(CIとKohanaの間で非常に難しい選択でした)。オプション5は私が今いるところです。

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

4

1 に答える 1

0

私は DataMapper でこれを試したことはありませんが、試してみてください (親コンストラクターなどすべてを呼び出すようにしてください)。Entry からすべてのプロパティ/メソッドを継承すると思いExerciseentryますが、DataMapper がこのように処理するかどうかはわかりません。

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
于 2011-11-09T14:54:29.337 に答える