thinkPHP3.2.3 关联模型 - 一对一关联

官方手册地址:http://document.thinkphp.cn/manual_3_2.html#relation_model

关联模型示例 - 一对一关联

HAS_ONE:当前模型拥有一个子对象 

(例:一个员工对应一个员工档案)

 

1.创建数据表

#用户表
CREATE TABLE `think_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表ID',
  `account` varchar(50) NOT NULL COMMENT '账户',
  `password` varchar(150) NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#档案表
CREATE TABLE `think_profile` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '人事档案ID',
  `user_id` int(11) DEFAULT NULL COMMENT '用户表ID',
  `nickname` varchar(80) DEFAULT NULL COMMENT '昵称',
  `email` varchar(50) DEFAULT NULL COMMENT '电子邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

 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. 创建用户模型(/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' 这样是错误的
        ),        
    );
}
View Code

 4. 创建用户数据

  访问 域名/home/user/relationModelAdd/account/zhangsan/password/123456/email/zhangsan@163.com/nickname/张三

  访问 域名/home/user/relationModelAdd/account/lisi/password/555555/email/lisi@163.com/nickname/李四

  访问 域名/home/user/relationModelAdd/account/wangwu/password/666666/email/wangwu@163.com/nickname/王五

  访问 域名/home/user/relationModelAdd/account/zhaoliu/password/333333/email/zhaoliu@163.com/nickname/赵六

    

   查看数据已同时新增到两个表中

  5. 更新数据

  修改用户表ID为 2 的数据,password 字段值改为:888888;同时更新 档案表对应 nickname 字段值改为:李四宝

  访问  域名/home/user/relationModelSave/id/2/password/888888/nickname/李四宝

 

 

   修改用户表ID为 3 的数据, account 改为:wanghua;同时更新 档案表对应 nickname 为:王华,email 字段更改为:wanghua@qq.com

  访问  域名/home/user/relationModelSave/id/3/account/wanghua/email/wanghua@qq.com/nickname/王华

 

6. 查询数据

  查询用户表ID 为 4 的数据

  访问 /home/user/relationModelQuery/id/4

 

   查询全部

  访问   域名/home/user/relationModelQuery

 7. 删除数据

   删除用户表 id 为 1 的数据

   访问   域名/home/user/relationModelDel/id/1

 

 

(完)

 

 

 

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 12:39  梦缘&江南~  阅读(679)  评论(0)    收藏  举报