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('删除成功!');
    }
}
View Code

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',
            // 定义更多的关联属性
            
        ),
    );
}
View Code

 

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)

 

posted @ 2019-10-29 16:56  梦缘&江南~  阅读(797)  评论(0)    收藏  举报