1

我正在运行一个在线食品杂志,用户可以在其中记录日记条目。有四种类型的条目:食物条目、运动条目、测量和完成的任务。条目有几个共同的属性(例如,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个大表,呃)
  2. 向下滚动超类型属性(4 个单独的表,呃)
  3. 去核并使用 Doctrine 2.0 ORM(YAML 配置文件,啊!)
  4. 使用其原生 ORM 支持表继承的不同框架(我将 Kohana 和 FuelPHP 与 CodeIgniter 列入候选名单)。
  5. 手动编码超类型和子类型关系(首先破坏了 ORM 的目的)。

我对我的任何选择都不感到兴奋。选项 1 和 2 会让人头疼(请参阅本文底部。选项 3 似乎是用大锤进行的手术。我对选项 4 持开放态度,因为我还没有开始编写任何框架代码(这是 CI 和 Kohana 之间的一个非常艰难的选择)。选项 5 就是我现在所在的位置。

有什么建议么?谢谢您的帮助!

4

1 回答 1

0

我没有用 DataMapper 试过这个,但你可以试试(确保调用父构造函数等等)。我会假设它Exerciseentry会从 Entry 继承所有属性/方法 - 但不确定 DataMapper 是否会以这种方式处理它:

class Entry extends DataMapper {

}

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

}

如果这不起作用,您基本上可以创建两个相关的对象(不是真正纯粹的 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 回答