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

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.kler.cn/a/508228.html

相关文章:

  • 鸿蒙动态路由实现方案
  • 【python】实现图像中的阴影去除 | 方案和代码
  • 【蓝桥杯】Python算法——求逆元的两种算法
  • ant design vue的级联选择器cascader的悬浮层样式怎么修改
  • 强化学习-蒙特卡洛方法
  • HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口
  • 花样贪吃蛇
  • (即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
  • DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
  • vue v-if和key值的注意的地方
  • 跨站请求伪造(CSRF)介绍
  • 多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)
  • redis做为缓存,mysql的数据如何与redis进行同步呢?
  • c#函数式编程
  • 微信小程序码生成
  • 力扣解题汇总(简单)_JAVA
  • ZooKeeper 常见问题与核心机制解析
  • C++实现设计模式---解释器模式 (Interpreter Pattern)
  • 学校C语言实验——结构2
  • 基于 K-Means 聚类分析实现人脸照片的快速分类
  • .Net WebApi 中的Token参数校验
  • 几个Linux系统安装体验(续): 中科方德服务器系统
  • OpenAI函数调用迎来重大升级:引入「最小惊讶原则」等软件工程实践,开发体验更上一层楼!
  • pix2pix mmgeneration通用场景黑白图片上色模型训练,Docker
  • postman接口测试-get请求
  • 【北京迅为】iTOP-4412全能版使用手册-第七十七章 Qt串口编程