来源于: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. CentOS7通过wget下载文件到指定目录

    查看自己的CentOS7系统有没有安装wget: [duanyongchun@192 3DUnetCNN]$ rpm -qa|grep wget 已安装提示: #已安装提示:wget-1.14-18. ...

  2. python常用模块 以及第三方导入

    python常用模块 1模块的分类 标准模块(内置模块)( 标准库 )300 第三方模块 18万 pip install 直接通过pip安装 软件一般会被自动安装你python安装目录的这个子目录里 ...

  3. P1130 红牌(动态规划)

    P1130 红牌 思路如下 这一题很像数字金字塔,我们可以正着求最小时间,当然也可以逆着求最小时间, 如果正着求:那么我们怎么求状态转移方程呢?,在这里我们假定状态转移方程为:dp[ i ][ j ] ...

  4. Vue学习(2)---v-指令和组件

    Vue中的指令 Vue中以带有前缀V-的属性被称为指令(带有v表示他们是Vue提供的特殊attribute) 一个v-bind的例子 <div id="app" v-bind ...

  5. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  6. JS数据结构与算法 - 二叉树(一)基本算法

    仅供JavaScript刷题参考用. 二叉查找树和平衡二叉树 其它树:满二叉树.完全二叉树.完美二叉树.哈弗曼树.二叉查找树BST.平衡二叉树AVL 了解:红黑树,是一种特殊的二叉树.这种树可以进行高 ...

  7. python--爬虫之JSON于JsonPath

    JSON json的引入 在python中json作为一个内建库不需要额外安装,只需要使用import json执行引入 json模块的功能 在python中json模块提供了四个功能:dumps.d ...

  8. Hadoop (六):MapReduce基本使用

    MapReduce原理 背景 因为如果要对海量数据进行计算,计算机的内存可能会不够. 因此可以把海量数据切割成小块多次计算. 而分布式系统可以把小块分给多态机器并行计算. MapReduce概述 Ma ...

  9. 团队项目-运动App

    一:团队成员介绍 队长:温学智 博客地址:https://www.cnblogs.com/dazhi151/                    技术型大佬,学习能力相对团队来说是最高的.并且作为班 ...

  10. Python zipfile模块学习

    转载自https://www.j4ml.com/t/15270 import zipfile import os from zipfile import ZipFile class ZipManage ...