网站后台内容编辑器下载,网站自动识别手机代码,深圳喷绘制作公司,装修免费预约平台【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客
《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书
使用VS Code开发ThinkPHP项目-CSDN博客
编程与应用开…【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客
《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书
使用VS Code开发ThinkPHP项目-CSDN博客
编程与应用开发_夏天又到了的博客-CSDN博客
关系数据库中的关联关系是其核心组成部分之一它们可以确保数据的一致性、优化查询语句、实现复杂的业务逻辑等。通过定义关联关系可以使得不同表之间存在明确的对应关系从而更好地反映业务需求。
在工程实践中一般有一对一、一对多、多对多三种关联关系。本文讲解ThinkPHP 8的一对一关联。
每个主模型有一个关联模型可以选择在主模型添加外键或者在关联模型添加外键在模型中使用hasOne方法定义。下面以用户模型和用户资料模型的示例来演示一对一关联用户表参见8.1节这里再创建一个用户资料表profile并加入一条id为1的记录可以使用MySQL Workbench工具来操作表及其数据学习起来相对方便SQL语句如下
CREATE TABLE profile (id int NOT NULL,mobile varchar(45) DEFAULT NULL,email varchar(45) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb3;
INSERT INTO mydb.profile(id,mobile,email) VALUES(1 ,13701352990,tom163.com );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}
}在ThinkPHP 8中默认会使用profile数据表的id作为关联键可以在定义关联关系时指定。比如上面代码中我们指定id为profile的关联键
return $this-hasOne(ProfileModel::class, id);
2. 属性模型
属性模型的示例如下
?php
namespace app\model;use think\Model;class ProfileModel extends Model
{protected $table profile;// 设置字段信息protected $schema [id int,mobile string,email string,];
}3. 关联查询
关联查询的示例如下
?php
namespace app\controller;use think\Model;
use app\model\UserModel;
use app\model\ProfileModel;class User {public function one2one(){$user UserModel::find(1);// 输出用户资料中的电子邮箱return $user-profile-email;}
}上面2个模型1个控制器完成后运行服务器在浏览器中访问http://localthost:8000/user/one2one可以查询出id为1的用户的电子邮箱。
4. 根据关联数据查询
上面的示例中我们是基于主模型进行查询的那么也可以根据关联模型进行查询。
下面是查询昵称为admin开头的用户示例
$users User::hasWhere(profile, function(Query $query) {$query-where(email, like, tom%);
})-select();5. 关联预载入
默认情况下只有在访问关联模型的属性时才会查询关联模型数据。比如下面的示例中如果有10个$users将产生11条查询1条查询主模型列表10条查询用户资料这就是著名的数据库N1问题。
$users UserModel::select();
foreach ($users as $user) {echo $user-profile-email;
}使用以下两种方案解决N1问题
1两次查询。第一次查询用户列表取得用户ID列表第二次使用IN查询方法查询用户资料。
2连表查询。直接使用数据库JOIN语句同时查询用户和用户资料。
ThinkPHP 8对上面两种方法都有对应的实现。
6. 两次查询
使用with方法传入关联名称即可示例如下
$users UserModel::with(profile)-select();
foreach ($users as $user) {echo $user-profile-email;
}如果需要自定义关联查询对象则可以使用闭包示例如下
$users UserModel::with([profile function(Query $query) {$query-field([id,name,email]);
}])-select();
foreach ($users as $user) {echo $user-profile-email;
}