请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 7955|回复: 0

[数据模型] 一对多数据关联

[复制链接]
发表于 2012-8-4 17:12:29 | 显示全部楼层 |阅读模式
前面我们已经介绍了spLinker的一对一关联,下面开始来介绍一对多的关联操作。

一对多关联的使用其实和一对一关联的几乎相同。

首先我们的例子是一个留言本程序,一个用户可以发布多条留言信息,而每条留言信息只能由一个用户来发布。

那么,我们有如下两个表:

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

  1. < ?php
  2. class user extends spModel
  3. {
  4.         public $pk = 'user_id';
  5.         public $table = 'user';
  6.         // 由spModel的变量$linker来设置表间关联
  7.         var $linker = array(
  8.                 array(
  9.                         'type' => 'hasone',   // 一对一关联
  10.                         'map' => 'detail',    // 关联的标识
  11.                         'mapkey' => 'user_id',
  12.                         'fclass' => 'user_detail',
  13.                         'fkey' => 'user_id',   
  14.                         'enabled' => false     
  15.                 ),
  16.                 array(
  17.                         'type' => 'hasmany',   // 一对多关联
  18.                         'map' => 'guestbook',    // 关联的标识
  19.                         'mapkey' => 'user_id',
  20.                         'fclass' => 'guestbook',
  21.                         'fkey' => 'user_id',
  22.                         'enabled' => true
  23.                 ),
  24.         );
  25. }
复制代码
guestbook.php
  1. < ?php
  2. class guestbook extends spModel
  3. {
  4.         public $pk = "gb_id";
  5.         public $table = "guestbook";
  6. }
复制代码
我们可以看到,$linker的配置多了一个hasmany类型的关联,这正是对留言表的关联。

除了类型,关联标识和对应类名不同外,其他的设置基本与一对一关联相同。

这里我们开始介绍一对多关联的各种操作:

CREATE

新增记录,与一对一关联稍微有些不同的是,一对多的CREATE支持在主表增加记录外,还支持同时向对应表增加一条或多条相应的记录。 例如:

  1. $newrow = array(
  2.         'user_name' => '羊村长', // 增加到主表的记录数据
  3.         'guestbook' => array( // 增加到对应表的记录数据
  4.                 array('contents'=>'大家好我是村长'), // 对应第一条记录
  5.                 array('contents'=>'下面我来说两句'), // 对应第二条记录
  6.                 array('contents'=>'以下省略一万五千字'), // 对应第三条记录
  7.         ),
  8. );
  9. $userObj = spClass("user");
  10. $userObj->spLinker()->create($newrow);
复制代码

执行程序后,我们来看看数据表:

user表

1 灰太狼

2 小羊羊

3 羊村长

guestbook表

1 大家好我是村长 3

2 下面我来说两句 3

3 以下省略一万五千字 3


我们可以看到,对应已经新增了三条对应的记录。

同时,如果只需要对应表中增加一条记录,也可以直接使用:

  1. $newrow = array(
  2.         'user_name' => '羊村长', // 增加到主表的记录数据
  3.         'guestbook' => array(
  4.                 'contents'=>'大家好我是村长',
  5.         ),
  6. );
复制代码
这个用法和一对一关联的CREATE是一样的。

在一对多关联中,UPDATE和DELETE这两个操作和一对一关联时也是相同,这里请直接参考一对一关联的教程。
不过还是需要提醒一下:

UPDATE的关联操作将同时改变对应表中全部相关的记录
DELETE的关联操作将同时删除对应表中全部相关的记录

同样的,find和findAll在一对多关联也是和一对一关联相同的,详细也请参考一对一关联的教程。

例子中我们使用findAll来进行示范:

  1. $userObj = spClass("user");
  2. $result = $userObj->spLinker()->findAll(); // 和上例一样的查找
  3. dump($result);
复制代码
结果:
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [user_id] => 12
  6.             [user_name] => 灰太狼
  7.             [guestbook] =>
  8.         )
  9.     [1] => Array
  10.         (
  11.             [user_id] => 14
  12.             [user_name] => 小羊羊
  13.             [guestbook] =>
  14.         )
  15.     [2] => Array
  16.         (
  17.             [user_id] => 16
  18.             [user_name] => 羊村长
  19.             [guestbook] => Array
  20.                 (
  21.                     [0] => Array
  22.                         (
  23.                             [gb_id] => 55
  24.                             [contents] => 大家好我是村长
  25.                             [user_id] => 16
  26.                         )
  27.                     [1] => Array
  28.                         (
  29.                             [gb_id] => 56
  30.                             [contents] => 下面我来说两句
  31.                             [user_id] => 16
  32.                         )
  33.                     [2] => Array
  34.                         (
  35.                             [gb_id] => 57
  36.                             [contents] => 以下省略一万五千字
  37.                             [user_id] => 16
  38.                         )
  39.                 )
  40.         )
  41. )
复制代码
您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-7-10 10:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表