FleaPHP 开发指南 - 7. 数据表关联

article/2025/9/12 4:12:56

数据表关联是指两个或者多个数据表的记录之间的逻辑关系。

例如:

  • 每一个公民都有一个身份证号码
  • 每一位作者都写了多本(0-n)书籍,而每一本书籍都有多个(1-n)作者
  • 每一篇文章都有多个(0-n)评论
  • 每一个评论都属于一篇文章

目前,FleaPHP 支持四种类型的数据表关联,分别是:

  • HAS_ONE: 当前表的每一条记录都拥有最多一条(0–1)关联记录
  • HAS_MANY: 当前表的每一条记录都拥有多条(0-n)关联记录
  • MANY_TO_MANY: 当前表的每一条记录都和其他表的多条(0-n)记录关联
  • BELONGS_TO: 当前表的每一条记录都属于另一个表的某条记录

在 FleaPHP 中,可以为每一个表数据入口定义多个不同的关联,例如:

<?php
load_class('FLEA_Db_TableDataGateway');
class Model_ProductClass extends FLEA_Db_TableDataGateway
{
var $tableName = 'product_class';
var $primaryKey = 'pclass_id';
var $hasMany = array(
array(
'tableClass' => 'Model_Permissions',
'foreignKey' => 'pclass_id',
'mappingName' => 'permissions',
),
array(
'tableClass' => 'Model_Products',
'foreignKey' => 'pclass_id',
'mappingName' => 'products',
'enabled' => false,
),
);
var $hasOne = array(
array(
'tableClass' => 'Model_ProductClassAdverts',
'foreignKey' => 'pclass_id',
'mappingName' => 'advert',
)
);
}
?>


术语

在详细介绍这四种关联之前,先了解一些后文将会用到的术语。

  • 关联: 一个关联是一个关系,这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。
  • 主表: 对于一个关联,拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。那么在这里(指这个关联),posts 就是主表。
  • 关联表: 在一个关联中,关联表就是除主表外的另一个表。
  • 外键: 在数据库原理中,外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中,外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。这个 user_id 字段就是一个外键。
  • 中间表: 在 MANY_TO_MANY 关联中,除了主表和关联表,还需要另一个表来保存这两个表的记录之间的互相关联关系。这个表称为中间表。

理解这几个术语后,我们再来看每一种关联的详细解释。



HAS_ONE 一对一关联

HAS_ONE 是一种非常简单的关联关系。表示一个记录拥有另一个记录。这两个记录分别位于两个数据表中。

示例

在一个信息管理系统中,users 表用于存储用户帐户的基本信息,例如用户名、密码等。而 profiles 表则用于存储用户的个人信息,例如家庭住址、邮政编码等。

由于每一个用户(一条 users 表中的记录)都有一份对应的个人信息(一条 profiles 表中的记录)。因此,我们就可以为 users 表定义一个 HAS_ONE 关联。

很明显,users 表的记录拥有一条 profiles 表的记录。因此,当 users 表中的一条记录被删除时,被删除记录所拥有的 profiles 表中的关联记录也会被自动删除。

表定义

在 HAS_ONE 关联中,要求外键放置在关联表中。

上述例子的表定义简化版如下:

users 表:

  • user_id 主键字段
  • username

profiles 表:

  • profile_id 主键字段
  • address
  • postcode
  • user_id 外键字段

对应的 MySQL 代码如下:

CREATE TABLE `users` (
`user_id` INT NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 32 ) NOT NULL ,
PRIMARY KEY ( `user_id` )
);
CREATE TABLE `profiles` (
`profile_id` INT NOT NULL AUTO_INCREMENT ,
`address` VARCHAR( 128 ) NOT NULL ,
`postcode` VARCHAR( 8 ) NOT NULL ,
`user_id` INT NOT NULL ,
PRIMARY KEY ( `profile_id` )
);

对应的 FLEA_Db_TableDataGateway 继承类的定义如下:

<?php
load_class('FLEA_Db_TableDataGateway');
class Users extends FLEA_Db_TableDataGateway
{
var $tableName = 'users';
var $primaryKey = 'user_id';
var $hasOne = array(
'tableClass' => 'Profiles',
'foreignKey' => 'user_id',
'mappingName' => 'profile',
);
}
class Profiles extends FLEA_Db_TableDataGateway
{
var $tableName = 'profiles';
var $primaryKey = 'profile_id';
}
?>

演示代码

<?php
// 首先插入一条 users 记录
$modelUsers =& new Users();
$newUserId = $modelUsers->create(
array('username' => 'dualface')
);
// 接下来,再插入一条 profiles 记录
$modelProfiles =& new Profiles();
$modelProfiles->create(
array(
'address' => 'SiChuan ZiGong',
'postcode' => '643000',
'user_id' => $newUserId
)
);
// OK,我们现在尝试读取一条 users 记录,看看会得到什么结果
$user = $modelUsers->find($newUserId);
dump($user);
?>

结果很有趣,多出来的 ‘profile’ 字段正好是我们刚刚插入 profiles 表的记录内容:

Array
(
[user_id] => 1
[username] => dualface
[ref___id] => 1
[profile] => Array
(
[profile_id] => 1
[address] => SiChuan ZiGong
[postcode] => 643000
[user_id] => 1
[ref___id] => 1
)
)

说明

在上面的例子中,Users 类中有一个 $hasOne 成员变量。该变量为一个数组:

var $hasOne = array(
'tableClass' => 'Profiles',
'foreignKey' => 'user_id',
'mappingName' => 'profile',
);

$hasOne 成员变量用于为一个表数据库入口指定 HAS_ONE 关联。

在关联的定义中,tableClass 指定关联表的表数据入口类名称,foreignKey 指定外键字段名,而 mappingName 则指定在主表的查询结果中用什么字段映射关联表的数据。





未完待续。。。。


http://chatgpt.dhexx.cn/article/kVhRiEH1.shtml

相关文章

FleaPHP 开发指南 - 5. 应用程序设置

FleaPHP 是一个具有高度灵活性的框架。开发者可以用不同的设置来调整 FleaPHP 的工作方式。这些设置统一保存在名为“应用程序设置”的数据源中。 实际上,除了 FleaPHP 框架本身,应用程序也可以使用“应用程序设置”来保存应用程序运行时需要的各种设置。 FleaPHP 的应用程…

FleaPHP 开发指南 - 6. 访问数据库

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。 连接数据库 在 htdocs 目录中创建子目录 testDB&#xff0c;并在子目录下创建文件 test1.php 文件&#xff0c;内容如下&#xff1a; <?phprequire(../FLEA/FLEA.php);__FLEA_P…

FleaPHP 的 Ajax 支持和 WebControls

原文地址&#xff1a; http://www.fleaphp.org/bbs/viewthread.php?tid40 FleaPHP 现在具有了基本的 Ajax 支持&#xff0c;示例代码如下&#xff1a; 首先在控制器显示模版的动作方法中有如下代码&#xff1a; /* * * 显示登录界面 */ function actionIndex() {…

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。…

获取和安装 FleaPHP

目前 FleaPHP 还处于开发中&#xff0c;您应该经常访问该页面&#xff0c;下载最新版本的 FleaPHP&#xff0c;或者通过 Subversion 仓库直接更新本地的 FleaPHP 代码。 FleaPHP 完全版和 FleaPHP runtime 核心合计下载次数已经超过 2000 次。 下载 FleaPHP 如果无法使用 Sub…

关于 FleaPHP

FleaPHP 并不是心血来潮的结果&#xff0c;而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力&#xff0c;也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。 FleaPHP 的设计目标 F…

http头部content-type与数据格式

http 头部中的 content-type 和我们传递的数据是息息相关的&#xff0c;不同的取值&#xff0c;服务器解析处理方式不同&#xff0c; 介绍一下几种常见的方式 text/plain&#xff1a;ajax默认方式&#xff0c;将文件设置为纯文本的形式&#xff0c;浏览器在获取到这种文件时…

http 协议中的content-type

content-type可以位于请求头、响应头&#xff0c;分别代表&#xff1a; Request头&#xff1a;请求的与实体对应的MIME信息&#xff08;post请求时的请求体&#xff09;Response头&#xff1a;返回内容的MIME类型 由于http1.0版规定&#xff0c;头信息必须是 ASCII 码类型&am…

contentType的类型及其在上传下载的例子

content-type之上传下载 下载 Content-Type 实体头部用于指示资源的MIME类型&#xff0c;在响应中&#xff0c;Content-Type标头告诉客户端实际返回的内容的类型。 Content-Disposition 是 MIME 协议的扩展&#xff0c;通常用在下载文件时&#xff0c;是下载文件的一个标识字…

Http中Content-Type等属性详解

前言 一直以来对HTTP请求中各种属性一知半解,偶然在博客中找到一篇,特意摘录过来方便自己以后查看. 正文 敬请关注博客&#xff0c;后期不断更新优质博文&#xff0c;谢谢 这里讲解Content-Type的可用值&#xff0c;以及在spring MVC中如何使用它们来映射请求信息。 1. Con…

HTTP首部——Content-Type的作用

前言 对于我们习以为常的东西&#xff0c;却没有仔细思考它的作用。 HTTP的首部都各有个的价值&#xff0c;最近看到这个Content-Type&#xff0c;忽然让我想起来以前自己的一个小小的失误&#xff0c;而产生了一个bug。但是当时却搞得我焦头烂额&#xff0c;我在网络上查找了一…

http(S)系列之(一):概念

参考文章&#xff1a; HTTP & HTTPS网络协议重点总结&#xff08;基于SSL/TLS的握手、TCP/IP协议基础、加密学&#xff09; 一篇比较全的HTTP协议详解 记&#xff1a;千万别误会&#xff0c;本章是完全ctrlc然后ctrlv&#xff0c;知识理解才是最重要&#xff0c;不必要在…

http 协议之 Content-Type

Content-Type 字段是 http 服务端返回给客户端时&#xff0c;head 里面带上的&#xff0c;这个字段表明服务端返回给客户端的 body 是什么类型的&#xff0c;然后客户端就可以根据这个类型进行文件处理。如浏览器客户端&#xff0c;针对 text/html 类型时&#xff0c;是直接显示…

Http中的Content-Type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

HTTP(S)协议详解

1 什么是协议 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。 粗俗理解协议就是 比如你的电脑和我的电脑要通信&#xff0c;&a…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

tomcat修改jdk配置两种方法

由于一个电脑多个项目,可能会使用多个版本的jdk,所以在跑tomcat的时候,可以自定义配置的各项目所使用的jdk 配置步骤(window设置): 1. 在catalina.bat找到如下代码: echo Using JAVA_HOME: “%JAVA_HOME%” 替换成 echo Using JAVA_HOME: “E:\Company\Tool\jdk1.7.0_13” 如…

linux下jdk配置

一、jdk下载 jdk下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 二、配置环境变量 1、解压 tar -xvf jdk-11.0.13_linux-x64_bin.tar.gz 2、配置环境变量 修改/etc/profile文件 vim /etc/profile 文件末尾添加 #jdk JAVA_HOME/usr/local/a…

Mac多JDK配置

Mac多JDK配置 开发环境有时候需要配置多个JDK&#xff0c;Windows下配置比较方便&#xff0c;Mac环境下稍微有点曲折 下载对于的JDK 这里我以JDK8、JDK11为例&#xff0c;可以从oracle官网下载&#xff0c;也可以从国内源下载,比如华为源 直接安装后 执行如下命令可以快速…