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();