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

ThinkPHP 8的一对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客

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

使用VS Code开发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.lryc.cn/news/523329.html

相关文章:

  • Django简介与虚拟环境安装Django
  • Redis延迟队列详解
  • 一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用
  • 第二代增强-采购申请屏幕增强
  • 图论DFS:黑红树
  • 零基础一篇打通Vue极速通关教程
  • 商城系统中的常见 BUG
  • 下定决心不去读研了。。。
  • 100个网络基础知识
  • 庄小焱——2024年博文总结与展望
  • 高通8255 Android STR 启动失败要因分析调查
  • Qt QML专栏目录结构
  • “深入浅出”系列之FFmpeg:(3)音视频开发的学习路线和必备知识
  • Webpack简述
  • 解决 Error: Invalid or corrupt jarfile day04_studentManager.jar 报错问题
  • ACL基础理论
  • 庄周梦蝶1
  • 使用SIPP发起媒体流性能测试详解
  • 瑞利衰落信道机理的详解
  • PyTorch使用教程(2)-torch包
  • Bash语言的函数实现
  • ChatGPT 写作系列
  • RK3576 Android14 状态栏和导航栏增加显示控制功能
  • SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例
  • Syncthing在ubuntu下的安装使用
  • 使用 Helm 安装 Redis 集群
  • 基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环
  • 【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法
  • 使用QQ登录(头条项目-09)
  • iOS页面设计:UIScrollView布局问题与应对策略