#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 用户表自动创建了新用户如:


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