我正在为我的codeigniter应用程序转向ORM并选择了datamapper。但是,在rules部分中,它说明了以下内容:
必须存在连接表 无论如何,每个相关的正常表 关系类型。
我有几十个与一对多关系的表格。这是否意味着我必须在每个表之间创建中间(连接)表,好像它们是多个?
答案 0 :(得分:2)
不,实际上,设置了$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.
这是由DMZ DataMapper库(http://www.overzealous.com/dmz/)处理的,它应该是旧的stensi DataMapper库的替代品,因此我将假设这些约定是相同。
即便如此,我强烈建议切换到DMZ。
答案 1 :(得分:1)
doc 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`)
)
答案 2 :(得分:0)
是的,不幸的是,它确实意味着。这是我必须更改数据库设计的原因之一