我正在运行在线食品杂志,用户可以在其中记录日记帐分录。有四种类型的条目:食物条目,运动条目,测量和完成的任务。条目具有几个共同的属性(例如,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和2会产生自己的麻烦(请参阅this article的底部)。选项3看起来像是用大锤进行手术。我对选项4持开放态度,因为我还没有开始编写任何框架代码(在CI和Kohana之间这是一个非常艰难的选择)。选项5是我现在的位置。
有什么建议吗?谢谢你的帮助!
答案 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