thinkPHP3.2.3 关联模型 - 一对多关联
官方手册地址:http://document.thinkphp.cn/manual_3_2.html#relation_model
关联模型示例 - 一对多关联
BELONGS_TO:当前模型从属于另外一个父对象
(例:一个员工对应一个部门,一个部门有多个人;操作数据时只修改本身数据,不会影响父对象数据)
HAS_MANY:当前模型拥有多个子对象
(例:一个作者有多个文章,一个文章只有一个作者;操作数据时,某些操作会影响子对象,如删除当前用户会同时删除对应的子对象数据)
1.创建数据表并插入数据
# 部门表
CREATE TABLE `think_dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门表ID', `name` varchar(50) NOT NULL COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; insert into `think_dept`(`id`,`name`) values (1,'市场部'),(2,'客服部');
# 文章表 CREATE TABLE `think_article` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章表ID', `name` varchar(120) NOT NULL COMMENT '名称', `user_id` int(11) NOT NULL COMMENT '用户表ID', `create_time` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; insert into `think_article`(`id`,`name`,`user_id`,`create_time`) values (1,'天龙八部',2,1572329680),(2,'射雕英雄传',2,1572329697),(3,'神雕侠侣',2,1572329708),(4,'鹿鼎记',2,1572329745),(5,'连城诀',2,1572329763),(6,'雪山飞狐',2,1572329775),(7,'书剑恩仇录',2,1572329787),(8,'碧血剑',2,1572329831),(9,'鸳鸯刀',2,1572329840),(10,'白马啸西风',2,1572329853),(11,'倚天屠龙记',2,1572329883),(12,'侠客行',2,1572329890),(13,'越女剑',2,1572329940),(14,'笑傲江湖',2,1572330030),(15,'鬼吹灯',3,1572330052),(16,'盗墓笔记',4,1572330066); # 在用户表 增加部门表ID 并设置值 ALTER TABLE `think_test`.`think_user` ADD COLUMN `dept_id` int(3) NOT NULL AFTER `sex`; UPDATE `think_test`.`think_user` SET `dept_id` = '1' WHERE `id` = '2'; UPDATE `think_test`.`think_user` SET `dept_id` = '2' WHERE `id` = '3'; UPDATE `think_test`.`think_user` SET `dept_id` = '1' WHERE `id` = '4';

2. 用户控制器 (/Application/Home/Controller)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { // 关联模型查询数据 public function relationModelQuery(){ $id = I('id/d'); $condition = 1; if($id > 0) $condition = "id=$id"; $user = D("User"); $result = $user-> relation(true)->where($condition)->select(); echo '<pre>';var_dump($result);exit; } // 关联模型新增数据 public function relationModelAdd(){ // 组装数据 方便验证 $data = array(); $data['account'] = I('account/s'); $data['password'] = I('password/s'); $data['email'] = I('email/s'); $data['nickname'] = I('nickname/s'); // 档案表数据 $data["Profile"] = array( 'email' => $data['email'], 'nickname' => $data['nickname'] ); // 实例化模型并验证数据 $user = D("User"); if(!$user->create($data)) exit($user->getError()); // 移除用户表多余数据 unset($data['email']); unset($data['nickname']); // 数据通过模型插入到数据库表中 $result = $user->relation(true)->add($data); if(!$result) exit('新增数据失败!'); exit('新增数据成功! ID:' . $result); } // 关联模型更新数据 public function relationModelSave(){ // 获取修改数据 $id = I('id/d'); $account = I('account/s'); $password = I('password/s'); $email = I('email/s'); $nickname = I('nickname/s'); if($id <= 0) exit('ID 不存在'); // 拼装需要更改的数据 $data = array(); if(strlen($account) > 0) $data['account'] = $account; if(strlen($password) > 0) $data['password'] = $password; if(strlen($email) > 0) $data['Profile']['email'] = $email; if(strlen($nickname) > 0) $data['Profile']['nickname'] = $nickname; // 实例化模型并通过关联模型更新数据 $user = D("User"); $result = $user-> relation(true)->where(array('id'=>$id))->save($data); if(!$result) exit('更新失败!'); exit('更新成功!影响行数:' . $result); } // 关联模型删除数据 public function relationModelDel(){ $id = I('id/d'); if($id <= 0) exit('ID 不存在'); $user = D("User"); $result = $user->relation(true)->delete($id); if(!$result) exit('删除失败!'); exit('删除成功!'); } }
3. 编码模型添加 BELONGS_TO 和 HAS_MANY 关联模型 (/Application/Home/Model)
<?php namespace Home\Model; use Think\Model\RelationModel; class UserModel extends RelationModel{ // 指定用户表 protected $tableName = 'user'; // 数据验证 protected $_validate = array( //array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]), array('account', 'require', '账户不能为空!', '', '', 1), // 必填验证 array('account', '', '帐号名称已经存在!', 0, 'unique', 1), // 唯一验证 array('password', 'require','密码不能为空!', '', '', 1), // 必填验证 array('email', 'email', 'email 格式错误', '', '', 1), // 邮箱验证 array('nickname', 'require', '昵称不能为空!', '', '', 1), // 必填验证 ); // 关联模型 protected $_link = array( // 一对一 关联档案表 // HAS_ONE关联表示当前模型拥有一个子对象 'Profile'=>array( 'mapping_type' => self::HAS_ONE, 'class_name' => 'Profile', // 定义更多的关联属性 'foreign_key' => 'user_id', // 关联的外键名称 'as_fields' => 'email,nickname', // 字符串中间不要有空格 例:'email, nickname' 这样是错误的 ), // 一对一 关联部门 // Belongs_to 关联表示当前模型从属于另外一个父对象 'Dept' => array( 'mapping_type' => self::BELONGS_TO, 'class_name' => 'Dept', 'foreign_key' => 'dept_id', // 部门表ID 'mapping_name' => 'dept', // 定义更多的关联属性 'as_fields' => 'name:dept_name', ), // 一对多 // HAS_MANY 关联表示当前模型拥有多个子对象 'Article' => array( 'mapping_type' => self::HAS_MANY, 'class_name' => 'Article', 'foreign_key' => 'user_id', 'mapping_name' => 'articles', 'mapping_order' => 'create_time desc', // 定义更多的关联属性 ), ); }
4. 删除用户表 ID 为 3 的用户
此操作会删除 user 表 id 为 3 的数据;dept 表不受影响;article 表将删除对应用户表ID的项,也就是 user_id=3 的值
访问 域名/home/user/relationModelDel/id/3

数据已同步删除。
thinkPHP 3.2.3 关联模型 - 一对一 (https://www.cnblogs.com/koreyoshi/articles/11758080.html)
thinkPHP 3.2.3 关联模型 - 一对多 (https://www.cnblogs.com/koreyoshi/articles/11759851.html)
thinkPHP 3.2.3 关联模型 - 多对多 (https://www.cnblogs.com/koreyoshi/articles/11760159.html)

浙公网安备 33010602011771号