如何在CodeIgnitor的DataMapper ORM中设置超类型和子类型关系?

时间:2011-11-09 08:56:05

标签: codeigniter codeigniter-datamapper subtype supertype

我正在运行在线食品杂志,用户可以在其中记录日记帐分录。有四种类型的条目:食物条目,运动条目,测量和完成的任务。条目具有几个共同的属性(例如,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设置超级和子类型关系?我查看了User Guide's Relationships和高级关系部分,但我找不到任何内容。

如果DataMapper无法实现,我可以想到一些解决方案:

  1. 滚动子类型属性(1大表,呃)
  2. 滚动超级类型属性(4个单独的表,呃)
  3. 去核并使用Doctrine 2.0 ORM(YAML配置文件,唉!)
  4. 使用其本机ORM支持表继承的其他框架(我使用CodeIgniter将Kohana和FuelPHP列入候选名单)。
  5. 手动编写超级和子类型关系(首先是破坏ORM的目的)。
  6. 我对我的任何选择都不感兴趣。选项1和2会产生自己的麻烦(请参阅this article的底部)。选项3看起来像是用大锤进行手术。我对选项4持开放态度,因为我还没有开始编写任何框架代码(在CI和Kohana之间这是一个非常艰难的选择)。选项5是我现在的位置。

    有什么建议吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分: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