ThinkPHP 8的一对多关联

server/2025/1/20 3:25:57/

【图书介绍】《PHP.html" title=ThinkPHP>ThinkPHP 8高效构建Web应用》-CSDN博客

《2025新书 PHP.html" title=ThinkPHP>ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 PHP.html" title=ThinkPHP>ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书

使用VS Code开发PHP.html" title=ThinkPHP>ThinkPHP项目-CSDN博客

编程与应用开发_夏天又到了的博客-CSDN博客

每个主模型都有多个关联模型,一般在关联模型添加一个外键实现,在模型中使用hasMany定义。下面是用户和地址的一对多关联示例。首先在mydb数据库中创建address表及其数据(表比较简单,我们赋予这表一个意义,即保存用户游玩过的省份。建议读者直接用MySQL Workbench工具快速完成),SQL语句如下:

CREATE TABLE `address` (`aid` int NOT NULL AUTO_INCREMENT,`id` int NOT NULL,`province` varchar(45) COLLATE utf8mb3_unicode_ci NOT NULL,PRIMARY KEY (`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(1,1, '北京' );
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(2,1, '上海' );
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(3,1, '广东' );

1. 用户模型

用户模型示例如下:

<?php
namespace app\model;use think\Model;class UserModel extends Model
{protected $table = 'users';// 设置字段信息protected $schema = ['id'          => 'int','name'        => 'string','nickname'      => 'string','status' => 'int',];public function profile(){return $this->hasOne(ProfileModel::class,'id'); // hasOne}// 在一对一关联示例代码的基础上,再加一个一对多关联方法public function addresses(){return $this->hasMany(AddressModel::class, 'id'); // hasMany}
}

2. 地址模型

地址模型示例如下:

<?php
namespace app\model;use think\Model;class AddressModel extends Model
{   protected $table = 'address';// 设置字段信息protected $schema = ['aid'		=> 'int','id'			=> 'int','province'	=> 'string',];
}

3. 关联查询

由于只有同一个数据库的数据表可以与表相连,因此在分库分表的场景下,笔者建议使用with查询两次的方法。

<?php
namespace app\controller;use think\Model;
use app\model\UserModel;
use app\model\ProfileModel;class User {public function one2many(){$users = UserModel::with('addresses')->select();foreach ($users as $user) {foreach($user->addresses as $address) {print_r($user->name.',  '. $address->province.'<br>');}}}
}

上面2个模型1个控制器完成后,运行服务器,在浏览器中访问http://localthost:8000/user/one2many,可以关联查询出id为1的用户所有游玩过的省份。

4. 关联保存

使用关联模型的saveAll方法保存关联数据。下面是批量保存地址的示例:

$user = UserModel::find(2);
$user->addresses()->saveAll([['province'=>'北京'],['province'=>'上海'],
]);

5. 关联删除

和一对一关联相同,一对多关联也使用together方法删除关联数据。示例如下:

$user->together(['addresses'])->delete();


http://www.ppmy.cn/server/159792.html

相关文章

Spring boot面试题----Spring Boot如何实现应用程序的热部署

一、使用 Spring Boot DevTools 步骤: 在项目的 pom.xml 文件中添加 Spring Boot DevTools 依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope>…

HBase实训:纸币冠字号查询任务

一、实验目的 1. 理解分布式数据存储系统HBase的架构和工作原理。 2. 掌握HBase表的设计原则&#xff0c;能够根据实际业务需求设计合理的表结构。 3. 学习使用HBase Java API进行数据的插入、查询和管理。 4. 实践分布式数据存储系统在大数据环境下的应用&#xff0c;…

算法4(力扣206)-反转链表

1、问题 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2、采用例子 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 3、实现思路 改变链表箭头的指向 4、具体步骤 &#xff08;1&#xff09;定义链表类 &#xff08;2&#xff…

MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互

在现代应用中&#xff0c;数据库是不可或缺的一部分。Java 作为一种广泛使用的编程语言&#xff0c;提供了丰富的 API 来与各种数据库进行交互。本文将详细介绍如何在 Java 中连接 MySQL 数据库&#xff0c;并实现基本的数据交互功能。 一、环境准备 1.1 安装 MySQL 首先&am…

如何选择合适的服务器?服务器租赁市场趋势分析

服务器租赁市场概览 服务器租赁 market可以分为两种类型&#xff1a;按小时、按月和按年&#xff0c;每种模式都有其特点和适用场景&#xff0c;按小时租赁是最经济实惠的选择&#xff0c;适用于短期需求&#xff1b;按月租赁则适合中长期使用&#xff1b;而按年租赁则是最灵活…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…

GPT-4o背后的语音技术

GPT-4o背后的语音技术 GPT-4o是一个any2any的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。本文主要谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。 GPT-4o (“o” 代表 “omni”) …

Day09-后端Web实战——部门管理开发Logback日志技术

目录 部门管理开发1. 删除部门1.1 需求分析 1.2 思路分析1.2.1 思路说明1.2.1 简单参数接收 1.3 代码实现1.4 Mybatis中的#与$ 2. 新增部门2.1 需求分析2.2 思路分析2.2.1 思路说明2.2.2 json参数接收 2.3 代码实现 3. 修改部门3.1 查询回显3.1.1 需求分析3.1.2 思路分析3.1.2.…