定义一对一关联

这里假设你已经把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

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());

}

}

?>

就会报出如下错误:

think php5关联模型,thinkphp5中关联模型的定义与使用方法相关推荐

  1. 四足动物模型控制中的模型自适应神经网络

    四足动物模型控制中的模型自适应神经网络 (Mode-Adaptive Neural Networks for Quadruped Motion Control) 四足动物模型拥有不同的步态,比如行走, ...

  2. 视频脚本: 完全模型组中的模型

    01 完全模型组   今天收到百度刘聪琳发送过来的完全模型组的比赛细则, 同时也把比赛中的立体模型造型照片也给发送过来了. 看来明年将是一个大获丰收的年份. 比赛细则明天公布, 下面让我们逐个来欣赏一 ...

  3. js中的数组Array定义与sort方法使用示例

    js中的数组Array定义与sort方法使用示例 Array的定义及sort方法使用示例 Array数组相当于java中的ArrayList  定义方法:  1:使用new Array(5  )创建数 ...

  4. php视图模型,ThinkPHP中视图模型详解.

    很多TP的新手对于模型中的视图模型不甚了解,官方虽然有详细手册,但是对于初学者来说还是比较难以理解! 先简单说一下视图模型所能实现的功能,基本就是主表与副表之间各个字段的关联问题,实现多表关联查询,相 ...

  5. php psr4 控制器调用模型,控制器中调用模型添加数据

    > ## 在控制器中调用模型进行添加数据 ### 1. 添加一条数据<save方法新增数据返回的是写入的记录数.> ```php // 注意不要在同一个实例里面多次新增数据,如果实在 ...

  6. 模型评估过程中,有哪些主要的验证方法?

    目录 1 Holdout检验 2 交叉检验 2.1 Leave p-out cross-validation 2.2 Leave-one-out cross-validation 2.3 Holdou ...

  7. php psr4 控制器调用模型,控制器中调用模型更新数据

    > ## 在控制器中调用模型进行更新数据 ### 1. 查找并更新(需要知道主键,不需要构造键名和表字段对应的数组) ``` $user = User::get(1); $user->na ...

  8. pmsm matlab模型,Simulink中PMSM模型的改进在电机控制仿真中的工程应用

    引言本文引用地址:http://www.eepw.com.cn/article/233863.htm 近年来,随着电力电子技术和稀土永磁材料的快速发展,永磁同步电机(permanent magnet ...

  9. python 验证模型_Python中的模型验证

    python 验证模型 This is a memo to share what I have learnt in Model Validation (using Python), capturing ...

最新文章

  1. 的标题形状工具在哪里_在PPT中如何用好形状排版
  2. 字节跳动大佬的Python自学笔记.pdf
  3. Java将一段逗号分割的字符串转换成一个数组
  4. css Gradients(渐变)
  5. HTTP面试题都在这里
  6. ITK:多路输出不同的类型
  7. linux下screen基本用法
  8. Ollydbg中断方法浅探
  9. 稀缺时尚男模促销海报|PSD分层,简单搞定设计稿
  10. imwrite函数 matlab_用matlab做一个脉动磁势分解的动画
  11. TIDB介绍 新数据库趋势
  12. al32utf8的日期格式_五分钟学会Oracle数据库字符集
  13. 信创终端高效运维与安全管理方案
  14. 【超图+CESIUM】【基础API使用示例】47、超图|CESIUM - 平行光源设置
  15. Linux僵尸进程怎么处理,Linux 僵尸进程如何处理
  16. python画k线_python下画k线
  17. 面向对象的英文全称叫做Object Oriented
  18. bzoj2429: [HAOI2006]聪明的猴子(最小生成树)
  19. matlab频率域滤波器,频率域滤波的MATLAB设计与实现_课程设计
  20. centos网络显示已连接但无法打开网页

热门文章

  1. 大数据技术在各行业中的挑战有哪些
  2. 如何进行大数据分析与处理
  3. 三门问题的MonteCarlo仿真方法
  4. 新东方php面试题,新东方学校各教师面试题和笔试题及答案(9套)
  5. Shell脚本编程之(五)条件判断式
  6. [2016百度之星 - 初赛(Astar Round2A)]Snacks
  7. 三星想抢苹果芯片订单?台积电表示想多了
  8. linux下i2c驱动笔记
  9. 嵌入式软件架构设计之分层设计
  10. 随机抽样之蓄水池算法