来源于:https://blog.csdn.net/u012600104/article/details/78927629

先说明,模型关联和join管理是不一样的,用文章和评论的关系来举例。(一对多关系)

一篇文章下可以有很多的评论。

(模型关联)前者只能查询到这个文章下的所有评论,并不能查看文章自己本身,不能将文章某些字段关联到评论上。

(join关联)可以查询到这个文章下的所有评论(主要看你是right还是left),也可以将文章某些字段关联到评论上。

定义一对一关联

这里假设你已经把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 表的模型类名就是 Adminpwn_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();
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();
//查询出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();
//查找出 pwn_admin_message 表关联aid为1是所有数据
$admin= $admin->AdminMessage()->select();
for($i=;$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'=>])->select();
$list1=Admin::has('AdminMessage',['aid'=>])->select();
var_dump($list1[]->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[]->toArray());
}
}
?>

就好报出如下错误:

tp5--模型关联的更多相关文章

  1. TP5模型关联问题

    在使用模型关联时:假如有表   merchant商户表   m_store 店铺表  m_store_ref 商户店铺关联表  user 普通用户表 $mer = Merchant::with([ ' ...

  2. tp5 模型关联,多表联查实用方法

    1.模型中建立关联关系 public function goods(){ return $this->belongsTo('app\common\model\goods\Goods', 'goo ...

  3. TP5.1框架中的模型关联

    一对一关联 hasOne('关联模型','外键','主键'); 关联模型(必须):关联的模型名或者类名 外键:默认的外键规则是当前模型名(不含命名空间,下同)+_id ,例如user_id 主键:当前 ...

  4. TP5 模型类和Db类的使用区别

    原文:http://www.upwqy.com/details/3.html 总结 在控制器中  模型操作  get() 和 all()  只能单独使用来查询数据   想要链式操作查询数据 需要使用f ...

  5. TP5模型belongsTo和hasOne的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  6. 关于THINKPHP5模型关联的初步理解

    初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则 ...

  7. TP5模型belongsTo和hasOne这两个方法的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  8. 「七天自制PHP框架」第四天:模型关联

    往期回顾:「七天自制PHP框架」第三天:PHP实现的设计模式,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 前阵子在网 ...

  9. TP3.1 一对多模型关联

    TP3.1.3 的一对多的模型关联 老需求 --- 一个用户多个文章,查看这些文章   HasMany 首先定义Model 模型名字叫UserMode.class.php class UserMode ...

  10. laravel 模型关联之(多对多)

    多对多 多对多就相当于一个专题Topic有多个文章,但是这多个文章又属于多个专题, 而且多对都必须有一个表是他们之间的关联关系表PostTopic Post表和Topic表之间没有直接的关联,而且通过 ...

随机推荐

  1. CSS3新增的选择器

    1. 层次选择器 子元素选择器: 只选择子元素    父选择器 > 子选择器 后面紧相邻的兄弟元素:  选择器1 + 选择器2 后面所有的兄弟元素:   选择器1 ~ 选择器2 2.属性选择器  ...

  2. HDU 2147kiki's game(巴什博弈变形)

    题目链接 思路如下 P : 必胜点,那个人先走到 含P的点,那个这个人一定会输, N:必败点,谁走到这个点谁输! 在这一个题中: 某个点是P还是 N,之与 ⬅️左边第一个点.⬇️下边第一个点.↙️左下 ...

  3. VM虚拟机复制文件问题

    需要安装好vmtools,安装好后,启动虚拟机环境: 把需要复制的文件拖进虚拟机环境窗口,鼠标指针会变成复制图标,直接左键即可复制: 不能Ctrl+c-Ctrl+v进去.

  4. (CSS):last-child与:last-of-type区别

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>la ...

  5. 携程首页--使用flex布局实现

    携程首页 flex解决了float和postion的遗留问题,对移动端比较友好. 需要水平排列的元素就为其父元素设置display:flex,并为子元素添加flex的值(比例) 布局时可以先从大的页面 ...

  6. iSCSI集群与存储

                                                                                                        ...

  7. 关于Tkinter的介绍

    Introduction to Tkinter 原英文教程地址zetcode.com In this part of the Tkinter tutorial, we introduce the Tk ...

  8. Linux 压缩备份篇(一 压缩与解压缩)

    .Z                compress程序压缩的档案 .bz2                bzip2程序压缩的档案 .gz                gzip程序压缩的档案 .t ...

  9. String 对象-->length 属性

    1.定义和用法 length 属性返回字符串的长度(字符数). 语法: string.length 注意:根据各国字符长度计算长度 举例: var str = 'abner pan' console. ...

  10. vue(element)中使用codemirror实现代码高亮,代码补全,版本差异对比

    vue(element)中使用codemirror实现代码高亮,代码补全,版本差异对比 使用的是vue语言,用element的组件,要做一个在线编辑代码,要求输入代码内容,可以进行高亮展示,可以切换各 ...