当前位置: 首页 > news >正文

php一对多关联,SpeedPHP/数据表一对多关联

一对多关联

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

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

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:

class 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:

class 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表

1 灰太狼

2 小羊羊

3 羊村长

guestbook表

1 大家好我是村长 3

2 下面我来说两句 3

3 以下省略一万五千字 3

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

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

$newrow = array(

'user_name' => '羊村长', // 增加到主表的记录数据

'guestbook' => array(

'contents'=>'大家好我是村长',

),

);

这个用法和一对一关联的CREATE是一样的。在一对多关联中,UPDATE和DELETE这两个操作和一对一关联时也是相同。

同样的,find和findAll在一对多关联也是和一对一关联相同的,例子中我们使用findAll来进行示范:

$userObj = spClass("user");

$result = $userObj->spLinker()->findAll(); // 和上例一样的查找

dump($result);

结果:

Array

(

[0] => Array

(

[user_id] => 12

[user_name] => 灰太狼

[guestbook] =>

)

[1] => Array

(

[user_id] => 14

[user_name] => 小羊羊

[guestbook] =>

)

[2] => Array

(

[user_id] => 16

[user_name] => 羊村长

[guestbook] => Array

(

[0] => Array

(

[gb_id] => 55

[contents] => 大家好我是村长

[user_id] => 16

)

[1] => Array

(

[gb_id] => 56

[contents] => 下面我来说两句

[user_id] => 16

)

[2] => Array

(

[gb_id] => 57

[contents] => 以下省略一万五千字

[user_id] => 16

)

)

)

)

参考来源

相关文章:

  • import matlab.engine,请教python导入matlab engine失败的问题。
  • php封装pdo连接书记库,PHP封装的PDO数据库操作类实例分析
  • 推荐几本php的好书,新手,求几本php的好书!
  • 管理python库的工具,Python的包管理工具
  • php 对象注入,小记一次PHP对象注入
  • oracle export表结构,oracle下导入导出表结构
  • oracle自定义异常标量,gqlgen/graphql自定义标量
  • oracle安装出现连接失败怎么办,oracle客户端PLSQL连接失败解决方法
  • oracle数据库架ssm,GitHub - wind0926/ssm-maven: smm框架+maven+oracle的旅游后台系统
  • oracle快速生成一千万条数据,[Oracle]快速生成大量模拟数据的方法
  • oracle存储过程生成uuid,存储过程 根据uuid
  • oracle submit_time,Oracle '26-2月 -19 03.34.47.000000 下午' 字符串日期解析
  • linux 计算字符串日期,在linux下获取时间字符串
  • linux 阻止 复位命令,Linux下锁定账号,禁止登录系统的设置总结
  • Linux怎么看每一级别的权限,linux 特殊权限chattr(文件系统级别的权限) Attr 权限和 ACL访问控制列表 ......
  • 【EOS】Cleos基础
  • 【译】理解JavaScript:new 关键字
  • Consul Config 使用Git做版本控制的实现
  • Facebook AccountKit 接入的坑点
  • Java面向对象及其三大特征
  • js数组之filter
  • PAT A1120
  • Python语法速览与机器学习开发环境搭建
  • Solarized Scheme
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 记一次和乔布斯合作最难忘的经历
  • 树莓派 - 使用须知
  • 双管齐下,VMware的容器新战略
  • 提醒我喝水chrome插件开发指南
  • 我有几个粽子,和一个故事
  • 学习HTTP相关知识笔记
  • 用jQuery怎么做到前后端分离
  • 原生Ajax
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 大数据全解:定义、价值及挑战
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Linux(帮助手册)
  • $.proxy和$.extend
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)windows配置JDK环境
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (篇九)MySQL常用内置函数
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)LINQ之路
  • (转)平衡树
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET/C# 的字符串暂存池
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET业务框架的构建
  • /3GB和/USERVA开关
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步