侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

thinkphp关联模型的定义与使用方法介绍

ThinkPHP  /  管理员 发布于 8年前   431

定义一对一关联

这里假设你已经把thinkphp5的环境都配置好了,数据库也连接OK了。想通过模型把两张表关联起来然后在通过控制器一调用就可以得到两张表的信息。

现在我准备了两张表,一张管理员表pwn_admin一张管理员信息表pwn_admin_message 为了能更方便的理解我把两张表的表结构也贴出来了。

下面是两张表的表结构信息:

CREATE TABLE `pwn_admin` (  `id` int(6) NOT NULL AUTO_INCREMENT,  `user` varchar(30) NOT NULL DEFAULT '',  `password` varchar(50) NOT NULL DEFAULT '',  `name` varchar(50) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
CREATE TABLE `pwn_admin_message` (  `id` int(6) NOT NULL AUTO_INCREMENT,  `email` varchar(30) NOT NULL DEFAULT '',  `mobile` varchar(50) NOT NULL DEFAULT '',  `aid` int(11) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

建模型文件

接下来是新建对应两张数据表的模型类文件。在模块下新建一个model目录然后新建两个文件并按对应的表命名:

1.jpg

模型命名

模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,比如上面两张表的表前缀是pwn_ 在模型名称里就需要省略掉。所以pwn_admin 表的模型类名就是 Admin ,pwn_admin_message 的模型类名就是AdminMessage

hasOne方法的参数包括:

hasOne(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’],’join类型’);

默认的join类型为INNER

模型定义

Admin模型对应的是 pwn_admin 表

<?phpnamespace app\index\model;use think\Model;class Admin extends Model{    function AdminMessage(){        //aid为外键id是adminmessage表关联admin表的外键        //id是 admin表的主键        return $this->hasOne('AdminMessage','aid','id')->field('id,coltype,auth,name,intro,xuhao,pid,pname');    }}?>

在Admin模型定义好关联的方法之后在AdminMessage模型里可以不用写任何对应的方法,但是必须最少要有一个对应pwn_admin_message 表的空模型。

相应的如果在这个模型里写了

<?phpnamespace app\index\model;use think\Model;class AdminMessage extends Model{}?>

有一点需要注意的是,关联方法的命名规范是驼峰法,而关联属性则一般是小写+下划线的方式,系统在获取的时候会自动转换对应,读取user_profile关联属性则对应的关联方法应该是userProfile。

控制器调用

在控制器想要使用关联模型就需要先引入模型类,比如我上面是在admin模型里定义了关联的方法,就需要把admin模型引入控制器。

use app\index\model\Admin
<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class Index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {        //get 1 是获取id为 1 的数据        //find() 是查找        //toArray()  是获取到的数据转为数组       $admin= Admin::get(1);    var_dump($admin->find()->toArray());    }    ?>

下面就可以访问以下浏览器看看结果了:

4.jpg

如果你的结果是这样只有admin管理员表的数据,别着急这是正常的。如果想要获取到关联表pwn_admin_message 的数据就需要先调用刚才定义的 AdminMessage() 模型方法,然后在指向find()方法取出数据。

注意:

这个find()方法是不可以省略掉的哦,我就是因为这个方法没加上所以一直不能取出完整的管理员信息。

<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {       $admin= Admin::get(1);       //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。       $admin= $admin->AdminMessage->find()->toArray();          var_dump($admin);        }    }  ?>

得到的结果是

5.jpg

因为是测试为了方便我就不用数字号码了,直接用文字代号这样比较直观明了。

hasWhere()方法:

如果要根据关联表的查询条件查询当前模型的数据,可以使用hasWhere方法,例如:

<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {        $admin=Admin::hasWhere('AdminMessage',['email'=>'[email protected]']);        $admin=$admin->find()->toArray();        var_dump($admin);    }   }    ?>

输出结果:

6.JPG


定义一对多关联

一对多的关联和一对一的关联的使用差不多都是一样的,区别是方法名不同。一对多在模型里使用的方法名是 hasMany 。hasMany 和 hasOne 的使用方法和参数基本相同。

hasMany参数是:

hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);

还是以上面两张表为例,但是为了配合一对多关联 pwn_admin_message 的内容还有aid 字段需要稍微修改一下。改成一个管理员有多个手机号,有多个email邮箱。

为了方便理解我把两张表的数据内容截图上来。

下图是 pwn_admin_message 表的内容:

7.jpg

下图是 pwn_admin 表的内容:

8.jpg

有几个管理员没有数据,不过没关系足够测试就可以了。好了废话不多说,开始进入正题。

相信大家一看就知道下面这个是admin模型的内容,对应的是pwd_admin 表

 <?phpnamespace app\index\model;use think\Model;class Admin extends Model{ public   function AdminMessage(){        //pid为外键id是adminmessage表关联admin表的外键        //id是 admin表的主键        return $this->hasMany('AdminMessage','aid','id');    }}

而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型

<?phpnamespace app\index\model;use think\Model;class AdminMessage extends Model{    /*        function Admin(){      return $this->belongsTo('Admin','aid','id');    }    */}?>

控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出

<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {       $admin= Admin::get(1);       //查找出 pwn_admin_message 表关联aid为1是所有数据       $admin= $admin->AdminMessage()->select();        for($i=0;$i<count($admin);$i++){            var_dump($admin            $i]->toArray());        }    }}?>

输出结果:

9.jpg

还有两个函数也顺便说一下了,一个是 hasWhere 还有一个 has 这两个都是根据关联条件来查询的,通俗点讲就是根据关联到 pwd_admin 表,的 pwn_admin_message 表字段的条件来查询的。如果换过来用pwd_admin里的字段作为条件查询的话就会报错。

<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {     //  $admin= Admin::get(1);     $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select();     $list1=Admin::has('AdminMessage',['aid'=>2])->select();    var_dump($list1[0]->toArray());    }   }   ?>

这样子关联得出的结果是正常的:

10.jpg

如果按 pwd_admin 表的字段做为搜索条件就会报错。比如我用一个 pwn_admin_message 没有的字段,用user字段来做为条件查询试试。

<?phpnamespace app\index\controller;use think\Controller;use app\index\model\Admin;class index extends Controller{    /**     * @param string $name     */    public function index($name='name')    {     //  $admin= Admin::get(1);    // $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select();     $list1=Admin::has('AdminMessage',['user'=>'jiehechen123'])->select();     var_dump($list1[0]->toArray());    }   }  ?>

就会报出如下错误:

11.jpg

推荐教程:《TP5》

以上就是thinkphp关联模型的定义与使用方法介绍的详细内容,更多请关注其它相关文章!


  • 上一条:
    ThinkPHP6自定义分页
    下一条:
    java selenium智能等待页面加载完成示例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客