Thinkphp5关联模型的定义与使用
定义一对一关联
这里假设你已经把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目录然后新建两个文件并按对应的表命名:
模型命名
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,比如上面两张表的表前缀是pwn_
在模型名称里就需要省略掉。所以pwn_admin
表的模型类名就是 Admin
,pwn_admin_message
的模型类名就是AdminMessage
hasOne方法的参数包括:
hasOne(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’],’join类型’);
默认的join
类型为INNER
模型定义
Admin模型对应的是 pwn_admin 表
<?php
namespace 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 表的空模型。
相应的如果在这个模型里写了
<?php
namespace app\index\model;use think\Model;
class AdminMessage extends Model{}
?>
有一点需要注意的是,关联方法的命名规范是驼峰法,而关联属性则一般是小写+下划线的方式,系统在获取的时候会自动转换对应,读取user_profile关联属性则对应的关联方法应该是userProfile。
控制器调用
在控制器想要使用关联模型就需要先引入模型类,比如我上面是在admin模型里定义了关联的方法,就需要把admin模型引入控制器。
use app\index\model\Admin
<?php
namespace 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());}?>
好啦下面就可以访问以下浏览器看看结果了。
如果你的结果是这样只有admin管理员表的数据,别着急这是正常的。如果想要获取到关联表pwn_admin_message
的数据就需要先调用刚才定义的 AdminMessage() 模型方法,然后在指向find()方法取出数据。
注意:
这个find()方法是不可以省略掉的哦,我就是因为这个方法没加上所以一直不能取出完整的管理员信息。
<?php
namespace 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);}}?>
得到的结果是
因为是测试为了方便我就不用数字号码了,直接用文字代号这样比较直观明了。
hasWhere()方法:
如果要根据关联表的查询条件查询当前模型的数据,可以使用hasWhere方法,例如:
<?php
namespace 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'=>'guanliB@ggg.com']);$admin=$admin->find()->toArray();var_dump($admin);}}?>
输出结果:
定义一对多关联
一对多的关联和一对一的关联的使用差不多都是一样的,区别是方法名不同。一对多在模型里使用的方法名是 hasMany
。hasMany 和 hasOne 的使用方法和参数基本相同。
hasMany
参数是:
hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);
还是以上面两张表为例,但是为了配合一对多关联 pwn_admin_message 的内容还有aid 字段需要稍微修改一下。改成一个管理员有多个手机号,有多个email邮箱。
为了方便理解我把两张表的数据内容截图上来。
下图是 pwn_admin_message 表的内容:
下图是 pwn_admin 表的内容:
有几个管理员没有数据,不过没关系足够测试就可以了。好了废话不多说,开始进入正题。
相信大家一看就知道下面这个是admin模型的内容,对应的是pwd_admin 表
<?php
namespace 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 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型
<?php
namespace app\index\model;
use think\Model;class AdminMessage extends Model{/* function Admin(){return $this->belongsTo('Admin','aid','id');}*/
}
?>
控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出
<?php
namespace 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());}}
}
?>
输出结果:
还有两个函数也顺便说一下了,一个是 hasWhere
还有一个 has
这两个都是根据关联条件来查询的,通俗点讲就是根据关联到 pwd_admin 表,的 pwn_admin_message 表字段的条件来查询的。如果换过来用pwd_admin里的字段作为条件查询的话就会报错。
<?php
namespace 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());}}?>
这样子关联得出的结果是正常的:
如果按 pwd_admin 表的字段做为搜索条件就会报错。比如我用一个 pwn_admin_message 没有的字段,用user字段来做为条件查询试试。
<?php
namespace 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());}}?>
就好报出如下错误:
好了我这里就讲这么多了,这篇文章主要讲一对一和一对多的几个常用使用使用方法而已,其他的还有好多方法的用法可以参考手册。我已经尽力的讲的很细了如果有不明白或是有什么宝贵意见的欢迎留言。
想要了解更多关关于联模型一对一一对多请点击这里
Thinkphp5关联模型的定义与使用相关推荐
- Thinkphp5关联模型多对多的定义与使用
想了想我还是觉得在写一篇关于多对多的文档吧,因为我看了官方的文档写的不够细,不好理解.我自己也花了时间去看人家的文档还有自己又做了一些测试才知道怎么用的现在把我做测试的所有过程分享给大家. 数据库表与 ...
- think php5关联模型,thinkphp5中关联模型的定义与使用方法
定义一对一关联 这里假设你已经把thinkphp5的环境都配置好了,数据库也连接OK了.想通过模型把两张表关联起来然后在通过控制器一调用就可以得到两张表的信息. 现在我准备了两张表,一张管理员表pwn ...
- think php5关联模型,thinkphp5的模型中使用关联
有以下两个表 artitcle表(表示文章) article的主键是id,外键是cateid,cateid对应于cate表的主键id. cate表(表示栏目) cate表的主键是id. 这两张表表示, ...
- ThinkPHP关联模型详解
在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...
- ThinkPHP5有关模型hasOne、hasMany、belongsTo详解
hinkPHP5有关联模型的操作,但有部分初学者对数据表中常见的几种表与表的关系还存在着问题,所以使用不好关联查询. 这里将hasOne.hasMany.belongsTo进行一个详细举例说明. 首先 ...
- ThinkPHP 3.2.3 关联模型的使用
关于关联模型 ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取.关联写入.关联删除等. 实例 博客管理模块关于博客有 4 张数据表:博客表 crm ...
- sequelize模型关联_使用Sequelize来计算关联模型中的行数(其中id ='x')
我试图建立一个留言板来教自己的JavaScript.我正在与: 的NodeJS angularjs 表示 MySQL的 我有一个视图/board,它使用以下路径(和相应的sqlize查询)来获取显示& ...
- thinkphp 关联模型配置代码
原文:thinkphp 关联模型配置代码 <?php /*** 公司与部门关联模型*/ class CompanyRelationModel extends RelationModel{//主表 ...
- thinkphp5 关联预载入怎么用
最近有使用TP开发.对->with和->withJoin这样的关联预载入感到不解,现记录总结如下: 关联查询的预查询载入功能,解决了性能与查询的之间的最优化选择问题,主要解决了N+1次查询 ...
最新文章
- “可扩展标记语言”(XML) 提供一种描述结构化数据的方法。
- Monokai风格的EditPlus配色方案
- junit4 的使用 顺便理解ClassPathXmlApplicationContext的使用
- 一次非常有意思的sql优化经历
- linux系统下载经验,linux系统的学习经验首篇
- 像素游戏的动态光影效果
- 简化软件产品的实际步骤
- Kafka->Flink->Hbase(纯DDL/DML形式)
- mysql本地连接错误解决办法
- 技术动态 | 知识图谱上的实体链接
- 查看tensor的形状,行列大小
- ML/DL-复习笔记【七】- 偏差和方差
- 十六进制颜色对应示意图
- java私塾跟我学系列_java 私塾作业
- 网站上部署Live2D模型(moc3格式)
- 圣诞老人python代码_用Python画圣诞老人的N种方法
- Redis发布订阅[西橙先生]
- windows系统常量
- ae-概述、流程、菜单01
- 全志A64触摸屏驱动调试