tp5--模型关联

摘要:
前者只能查询到这个文章下的所有评论,并不能查看文章自己本身,不能将文章某些字段关联到评论上。想通过模型把两张表关联起来然后在通过控制器一调用就可以得到两张表的信息。所以pwn_admin表的模型类名就是Admin,pwn_admin_message的模型类名就是AdminMessagehasOne方法的参数包括:hasOne;默认的join类型为INNER模型定义Admin模型对应的是pwn_admin表在Admin模型定义好关联的方法之后在AdminMessage模型里可以不用写任何对应的方法,但是必须最少要有一个对应pwn_admin_message表的空模型。

来源于: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
namespaceappindexmodel;

use thinkModel;
classAdmin 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
namespaceappindexmodel;

use thinkModel;
classAdminMessage extends Model{


}
?>

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

控制器调用

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

use appindexmodelAdmin

<?php
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classIndex 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
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classindex 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
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classindex 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
namespaceappindexmodel;

use thinkModel;
classAdmin extends Model{

 publicfunction AdminMessage(){
        //pid为外键id是adminmessage表关联admin表的外键
        //id是 admin表的主键
        return $this->hasMany('AdminMessage','aid','id');
    }
}

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

<?php
namespaceappindexmodel;
use thinkModel;

classAdminMessage extends Model{
    /*function Admin(){
      return $this->belongsTo('Admin','aid','id');
    }
    */}
?>

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

<?php
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classindex 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
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classindex 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
namespaceappindexcontroller;
use thinkController;
use appindexmodelAdmin;

classindex 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());
    }
   }
  ?>

就好报出如下错误:
这里写图片描述

免责声明:文章转载自《tp5--模型关联》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在安卓手机上通过虚拟机运行Windows XPOracle用户名及默认密码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

log4php配置文件实例

简介:这是log4php配置文件实例的详细页面,介绍了和php,php, log4php, properties log4php配置文件实例有关的知识、技巧、经验,和一些php源码等。 frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=344666' scrolling='no...

activemq 安装配置二

管理后台地址http://localhost:8161/admin 或 http://127.0.0.1:8161/admin 默认用户名密码admin admin,端口默认是8161,且服务采用的是服务器,所以我们进入到conf/jetty.xml 一. 放开本地访问限制 将host由127.0.0.1 变更为0.0.0.0 , 放开非本地访问限制...

php/phpmyadmin新手式环境搭建

PHP 之前就在折腾 zabbix 的时候遇到一个情况, 安装 php6 的时候各种库丢失, 最重要的 gd 经常跑路 只是无意中遇到了一种小方式, 现在已经迷糊了, 前天因为在部署 phpAdmin 的时候搬出来旧的记录资料, 是关于 php7 的, yum install php70w-common php70w-fpm php70w-opcache...

使用podman容器部署飞儿云框架

首先 podman pull php:7.4-apache 删除之前运行的 podman rm -f 8082 然后 podman run -d --name 8082 -p 8082:80-v /home/firadio/firadio-yun-php/:/home/firadio/firadio-yun-php/-v /home/firadio/fir...

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input 对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。 “php://input allows you to read raw POST data. It...

审计基础-PHP命令执行

1. 命令执行 1.1 程序执行函数 程序执行函数 这些函数和 执行运算符 是紧密关联的。 因此,当运行在 安全模式 时,你必须考虑 safe_mode_exec_dir指示 exec PHP 457 exec — 执行一个外部程序 exec ( string $command ) : string 返回命令执行结果的最后一行内容,实际不echo出来的话回...