2010-02-24 50 views

回答

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的做了一桌recipesrecipe_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。

0

是的,不幸的是,它的确如此。这就是为什么我不得不改变我的数据库设计的原因之一

+0

不,它不。只有你有多次加入。阅读文档。 – 2011-06-14 13:31:05

1

文档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`) 
)