关联定义

一对多关联的情况也比较常见,使用hasMany方法定义,参数包括:

hasMany('关联模型名','外键名','主键名',['模型别名定义']);

例如租客表和宿舍表,一个宿舍有多个租客,宿舍和租客一对多的关系,表结构如下:

#宿舍
CREATE TABLE `apartment` (
`apar_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`apar_name` varchar(40) DEFAULT NULL COMMENT '名称',
`apar_type` varchar(20) DEFAULT NULL COMMENT '类型',
`apar_price` varchar(30) DEFAULT NULL COMMENT '价格',
`apar_sum` int(11) DEFAULT NULL COMMENT '床数',
PRIMARY KEY (`apar_id`)
) COMMENT='宿舍'; #租客
CREATE TABLE `client` (
`cli_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`aid` int(11) DEFAULT NULL COMMENT '外键', #房间
`cli_name` varchar(20) DEFAULT NULL COMMENT '姓名',
`cli_sex` varchar(20) DEFAULT NULL COMMENT '性别',
`cli_phone` varchar(40) DEFAULT NULL COMMENT '电话',
`cli_identity` varchar(50) DEFAULT NULL COMMENT '身份证',
`cli_reservation` varchar(40) DEFAULT NULL COMMENT '预定房间',
PRIMARY KEY (`cli_id`),
KEY `Apar_id` (`aid`),
CONSTRAINT `client_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `apartment` (`apar_id`)
) COMMENT='租客';

宿舍表的模型用hasMany方法,这样已经关联租客表:

<?php
namespace app\demo\model;
use think\Model;
//宿舍
class Apartment extends Model
{
//定义关联方法
public function comm(){
//hasMany('租客表名','租客表外键','宿舍主键',['模型别名定义']);
return $this->hasMany('client','aid','apar_id');
}
}

关联查询

我们可以通过下面的方式获取关联数据:

    //方法一:这个需要调用$apr->comm才查顾客表
$apr = Apartment::get(1);
$apr->comm;//注意这里不加括号
//方法二:不用调用$apr->comm,预先查租客表
$apr = Apartment::get(1,'comm');

注:comm是一个属性,这里先执行comm()把里面的租客信息封装到comm;comm()是关联模型,comm返回是租客的信息

根据关联条件查询

    //根据关联条件查询
$apr = Apartment::get(1);
$data = $apr->comm()->where('cli_name','陈芬')->select();
print_r($data);
//或者使用getBy
$apr = Apartment::get(1);
$data = $apr->comm()->getByCliName('陈芬');
print_r($data);

关联聚合查询

      //聚合查询,默认查询宿舍的租客人数'>='1的宿舍
$apr = Apartment::has('comm')->select();
//查询宿舍的租客人数'>='3的宿舍
$apr = Apartment::has('comm','>=','3')->where('apar_name','410')->select();
print_r($apr);

也可以查询全部宿舍和全部租客相关联的信息 ,如下:

        //方法一:获取全部数据
$apr = Apartment::all();
foreach ($apr as $list) {
//$list->comm封装全部租客的信息,一个宿舍有多个租客
foreach ($list->comm as $ac){
echo "姓名:{$ac->cli_name},房号:{$list->apar_name}<br>";
}
}
//方法二:使用关联预查询功能,有效提高性能。
$apr = Apartment::with('comm')->select();
foreach ($apr as $list) {
//$list->comm封装全部租客的信息,一个宿舍有多个租客
foreach ($list->comm as $ac){
echo "姓名:{$ac->cli_name},房号:{$list->apar_name}<br>";
}
}

关联新增

      //新增,添加一位租客
$apr = Apartment::get(1);
$cli = new Client();
$cli->cli_name = "小唐";
$cli->cli_sex = '男';
$cli->cli_phone='1315***';
$cli->cli_identity='4487654334567610';
$cli->cli_reservation='没有';
$apr->comm()->save($cli);

如果想批量新增,如下:

//批量新增租客
$apr = Apartment::get(2);
$cli = [
["cli_name"=>'阿K','cli_sex'=>'男','cli_phone'=>'1315***','cli_identity'=>'448***','cli_reservation'=>'没有'],
["cli_name"=>'小胡','cli_sex'=>'男','cli_phone'=>'1315***','cli_identity'=>'448***','cli_reservation'=>'没有']
];
$apr->comm()->saveAll($cli);

关联更新

        //更新
$apr = Apartment::get(1);
$comm = $apr->comm()->getByCliName('陈杨文');
$comm->cli_name='杨文';
$comm->save();
//或者通过update方法更新
$apr = Apartment::get(1);
$apr->comm()->where('cli_id',5)->update(['cli_name'=>'陈杨文']);

关联删除

        //删除id为13的租客
$apr = Apartment::get(2);
$comm = $apr->comm()->getByCliId(13);
$comm->delete();
//删除所有的关联数据
$apr = Apartment::get(2);
$apr->$comm()->delete();

ThinkPHP5——模型关联(一对多关联)的更多相关文章

  1. 后盾网lavarel视频项目---模型一对多关联简单实例

    后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...

  2. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  3. TP5一对一、一对多关联模型的使用

    文章表SQL CREATE TABLE `tp_article` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `title` varc ...

  4. ThinkPHP5——模型关联(多对多关联)

    关联定义 多对多关联不像一对一和一对多关联,它还要多建一个中间表用来处理多对多的关联,例如: #城市 create table city ( c_id int primary key AUTO_INC ...

  5. thinkphp5 模型表关联

    student 表 外键 grade_idgrade 表主键 id在 模型中student表关联方法public function Grade(){ return $this->hasOne(' ...

  6. ThinkPHP5——模型关联(一对一关联)

    定义 定义一对一关联使用了hasOne,hasOne方法的参数包括: hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型'); 下面定义一个用户表,公司给每个用 ...

  7. 深入理解 Laravel Eloquent(三)——模型间关系(关联)

    Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...

  8. [转]NHibernate之旅(10):探索父子(一对多)关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  9. Ruby on Rails,一对多关联(One-to-Many)

    在上一篇文章中,我们知道通过has_one和belongs_to方法定义一对一关联关系.接下来是更常见的情况,一对多关联.比如老师与所教课程的关系,一个老师负责多个课程.换成对象之间的关系就是:一个老 ...

随机推荐

  1. 单(single):换根dp,表达式分析,高斯消元

    虽说这题看大家都改得好快啊,但是为什么我感觉这题挺难.(我好菜啊) 所以不管怎么说那群切掉这题的大佬是不会看这篇博客的所以我要开始自嗨了. 这题,明显是树dp啊.只不过出题人想看你发疯,询问二合一了而 ...

  2. 一张图牢记vim常用命令

    1.示例(前提要切到命令状态) ^  光标移动到行首 $  光标移动到行尾 set nu 显示行号 :%s/foo/bar/g 会在全局范围(%)查找foo并替换为bar,所有出现都会被替换(g) 参 ...

  3. 爬虫之request库主要解析---参照慕课北理工嵩天

    kv = {'key1':'value1','key2':'value2'} r = requests.request (' GET' , 'http://python123.io/ws' , par ...

  4. 手写jwt验证,实现java和node无缝切换

    前言 前端时间和我朋友写了一个简易用户管理后台,功能其实很简单,涉及到的技术栈有:vue+elementUI,java+spring MVC以及node+egg,数据库用的mysql,简单方便. 一开 ...

  5. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  6. Anaconda的安装和详细介绍(带图文)

    Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大( ...

  7. setAccessible()方法

    在java代码中,我们经常使用private来控制类中成员变量的访问权限,在类的外边我们一般使用get方法获取私有成员变量的值,但是如果类中没有get方法,但我们又想获取该类私有成员变量的值,该怎么办 ...

  8. Scrapy进阶知识点总结(四)——Item Pipeline

    Item Pipeline Item Pipeline调用发生在Spider产生Item之后.当Spider解析完Response之后,Item就会传递到Item Pipeline,被定义的Item ...

  9. MQ应用之解耦

    简介 消息队列 MQ 既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性. 应用场景 削峰填谷:诸如秒杀.抢红包.企业开门红等大型活动时皆 ...

  10. 微信小程序api封装(promise)

    顺带这是我平时公司切换改变网络环境 直接上代码,我相信就可以懂了, //app.js function fetchApi(url, type, params, method) { return new ...