关于一对多关联的疑惑

#1 sea桥

我完全按照手册中的例子进行测试,
user 用户表
user_id int 用户ID 自增/主键
user_name varchar(50) 用户名 唯一
guestbook 留言表
gb_id int 留言ID 自增/主键
contents varchar(255) 留言内容
user_id int 对应的用户ID

然后我们建立了两个表的对应spModel继承类,主表仍然是用户表,而对应表则是留言表。
请注意主表的$linker的设置:
user.php
< ?phpclass user extends spModel{        public $pk = 'user_id';        public $table = 'user';        // 由spModel的变量$linker来设置表间关联        var $linker = array(                array(                        'type' => 'hasone',   // 一对一关联                        'map' => 'detail',    // 关联的标识                        'mapkey' => 'user_id',                        'fclass' => 'user_detail',                         'fkey' => 'user_id',                            'enabled' => false                     ),                array(                        'type' => 'hasmany',   // 一对多关联                        'map' => 'guestbook',    // 关联的标识                        'mapkey' => 'user_id',                         'fclass' => 'guestbook',                        'fkey' => 'user_id',                        'enabled' => true                ),        );}guestbook.php
< ?phpclass guestbook extends spModel{        public $pk = "gb_id";        public $table = "guestbook";}我们可以看到,$linker的配置多了一个hasmany类型的关联,这正是对留言表的关联。
除了类型,关联标识和对应类名不同外,其他的设置基本与一对一关联相同。
这里我们开始介绍一对多关联的各种操作:
CREATE
新增记录,与一对一关联稍微有些不同的是,一对多的CREATE支持在主表增加记录外,还支持同时向对应表增加一条或多条相应的记录。 例如:
                $newrow = array(                         'user_name' => '羊村长', // 增加到主表的记录数据                        'guestbook' => array( // 增加到对应表的记录数据                                array('contents'=>'大家好我是村长'), // 对应第一条记录                                array('contents'=>'下面我来说两句'), // 对应第二条记录                                array('contents'=>'以下省略一万五千字'), // 对应第三条记录                        ),                );                $userObj = spClass("user");                $userObj->spLinker()->create($newrow);
最后的确成功插入了内容,但每次会同时插入user 用户表自动创建了新用户如:
1329196270926.jpg

1329196210969.jpg
本来我的想的是,为用户seaqi新增一条contents内容,没想到又新增了一个用户,一对多在这里没有意义了
分析源码得知,程序在一对多的情况下会先新增主表,再新增从表通过数组的维度来控制,请问一对多在create情况下一定要统一的新增吗?这种方法适合用到哪里?



2012-02-14 13:16:56

#2 jake

其实一对多等等,关联的update,create,delete都很少人使用,这里也建议不需要再使用这种方法。直接由开发者自己控制会更好。

新版里面,关联只能用于查询了。

2012-02-14 13:29:51

#3 sea桥

原来如此啊,多谢,不过如果为关联多加一个插入的判断即在关联时多加一个关联配置元素,实现我想要的功能没什么问题,而且可以使多维数组表现的更有用  呵呵

2012-02-14 13:45:53