我正朝着我的codeigniter应用程序的ORM迈进,并选择了datamapper。然而,在rules部分,它指出以下:用于Codeigniter的Datamapper是否强制所有关系的中间表?
的接合表必须 之间存在每个相关普通表,而不管关系的类型的 。
我有几十个处于“一对多”关系的表。这是否意味着我必须在它们之间创建中间(加入)表格,就好像它们很多 - 很多?
我正朝着我的codeigniter应用程序的ORM迈进,并选择了datamapper。然而,在rules部分,它指出以下:用于Codeigniter的Datamapper是否强制所有关系的中间表?
的接合表必须 之间存在每个相关普通表,而不管关系的类型的 。
我有几十个处于“一对多”关系的表。这是否意味着我必须在它们之间创建中间(加入)表格,就好像它们很多 - 很多?
不,实际上,具有$has_one
关系组将在_id,
结尾的字段,是指与$has_many
关系集中的对象模型。
因此,举例来说:
class Recipe extends DataMapper {
var $has_many = array('product', 'rating', 'recipe_category');
var $has_one = array('recipe_source', 'user');
(...)
}
class Recipe_Source extends DataMapper {
var $has_many = array('recipe');
(...)
}
在这种情况下,DataMapper的做了一桌recipes
与recipe_source_id
柱和recipe_sources
表不需要额外的字段。
现在,对于多对多关系,将创建一个连接表,并遵循严格的约定。
连接表名称将按照字母顺序由连接模型的两个复数形式(用下划线分隔)组成。
因此,使用这种模式:
class Product extends DataMapper {
var $has_one = array('cheese_style', 'butter_style', 'cheese_flavor');
var $has_many = array('product_size', 'recipe');
(...)
}
现在,我结束了我的数据库连接表称为products_recipes.
这是它是如何通过非军事区的DataMapper库(http://www.overzealous.com/dmz/)进行处理,这应该是旧的stensi DataMapper库的替代品,所以我将假定约定是相同的。
即便如此,我强烈建议您切换到DMZ。
是的,不幸的是,它的确如此。这就是为什么我不得不改变我的数据库设计的原因之一
文档nevers在一个地方显式说明你应该如何避免使用连接表来表现一对多的关系。您收集周围的信息(数据库表,建立关系,高级关系),并了解可能不会显示如何操作。
只是用“_id”后缀约定创建在子表的外键和DataMapper的应承认它自动(至少是如何制定出对我来说),假设您设置HAS_ONE并且在两个模型中具有has_many属性。由于country_id在这个例子中:
// class User extends DataMapper { var $has_one = array('country'); ... }
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`country_id` int(10) unsigned NOT NULL,
`username` varchar(20) NOT NULL,
`password` varchar(50) NOT NULL,
`confirm_password` varchar(50) NOT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
// class Country extends DataMapper { var $has_many = array('user'); ... }
CREATE TABLE `countries` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
)
不,它不。只有你有多次加入。阅读文档。 – 2011-06-14 13:31:05