ThinkPHP5——模型的一对多关联

关联定义

一对多关联的情况也比较常见,使用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‘);

根据关联条件查询

    //根据关联条件查询
        $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::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();    

原文地址:https://www.cnblogs.com/bushui/p/11886457.html

时间: 2024-10-09 18:24:06

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

thinkphp5 模型表关联

student 表 外键 grade_idgrade 表主键 id在 模型中student表关联方法public function Grade(){ return $this->hasOne('Grade','id','grade_id','');} 在控制器中 使用 $artres = Student::with("grade")->paginate()->toArray(); with 表示关联, toArray 必须用负责转换不成数组 原文地址:https://

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

本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NHibernate查询语言(HQL,NHibernate Query Language).条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况).原生SQL(Literal SQL,T-SQL.PL/SQL).这一节分别使用这三种方式来

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

Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了).所谓 "对象",就是本文所说的 "模型(Model)":对象关系映射,即为模型间关系.中文文档: http://laravel-china.org/docs/eloquent#relationships 下

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

在上一篇文章中,我们知道通过has_one和belongs_to方法定义一对一关联关系.接下来是更常见的情况,一对多关联.比如老师与所教课程的关系,一个老师负责多个课程.换成对象之间的关系就是:一个老师has may课程,课程belongs to老师. 和一对一关联的相似之处是 关联关系也是通过外键建立的. 子对象都会拥有一个父对象的引用,使用belongs_to表示与父对象的关系. 不同之处是 一个父对象对应多个子对象而不是只对应一个.所以需要在父对象中改用has_many引用子对象. 由于h

4.一对多关联映射

1.实体一对多关联 一对多联系(1:n)定义:如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n.实例:一个班级中有若干名学生,每个学生只在一个班级中学习. 2.数据库一对多关联 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方. 3.Hibernate单向一对多关联 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方

通过rowexpander插件展现一对多关联数据

先看效果 样品和审核记录是一对多的关系,通过XTemplate来展现数据.如果后台的数据是JSON格式的,这个事情就简单了,但是如果后台的数据是XML的,并且通过Model之间的hasmany关系来配置,就复杂一些了. 解决方案: model.Sample.js Ext.define("Soims.model.Sample", {     extend: 'Ext.data.Model',     requires: ['Soims.model.SampleAudit'], // 引用

hihernate一对多关联映射

一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 举个例子员工和老板.你说是老板记员工比较容易还是员工记老板比较容易呢?很明显记少的比较容易啊,能维护二者的关系也能减少工作量.hibernate当然也是这么做的. 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同 在关系型数据库理论中,"多对一"关联同于"一对多"关联

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

一对多关联

1.什么是一对多关联 如果是2张表具有一对多的关系,希望在使用Hibernate操作"一"方数据时,可以自动关联操作”多“方数据,那么这种关联映射称之为一对多关联. 2.一对多关联的作用 可以通过”一“来操作”多“,包括 通过查询”一“,自动查询”多“ 通过新增/修改"一",自动新增/修改“多”. 通过删除“一”,自动删除“多”. 3.明确关系字段 以account与service为例 account与service具有一对多关系,其关系字段是service.acc