## 一对一关联

| 版本 | 功能调整 |

| --- | --- |

| 5.0.5 | 增加关联自动写入和删除 |

| 5.0.4 | 增加关联属性绑定到父模型功能 |

### 定义

定义一对一关联,例如,一个用户都有一个个人资料,我们定义`User`模型如下:

~~~

namespace app\index\model;

use think\Model;

class User extends Model

{

public function profile()

{

return $this->hasOne('Profile');

}

}

~~~

`hasOne`方法的参数包括:

> ### hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');

默认的`join`类型为`INNER`。

`V5.0.3+`版本开始,可以支持为关联模型定义需要查询的字段,例如:

~~~

namespace app\index\model;

use think\Model;

class User extends Model

{

public function profile()

{

return $this->hasOne('Profile')->field('id,name,email');

}

}

~~~

> 如果使用的是`join`方式的关联,不支持指定field字段。

`5.0.5+`版本开始,模型别名定义参数已经废弃。

### 关联查找

定义好关联之后,就可以使用下面的方法获取关联数据:

~~~

$user = User::get(1);

// 输出Profile关联模型的email属性

echo $user->profile->email;

~~~

如果要根据关联表的查询条件查询当前模型的数据,可以使用`hasWhere`方法,例如:

~~~

$user = User::hasWhere('profile',['email'=>'thinkphp@qq.com'])->find();

echo $user->name;

~~~

默认情况下, 我们使用的是`user_id` 作为外键关联,如果不是的话则需要在关联定义的时候指定,例如:

~~~

namespace app\index\model;

use think\Model;

class User extends Model

{

public function profile()

{

return $this->hasOne('Profile','uid');

}

}

~~~

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

### 关联新增

~~~

$user = User::get(1);

// 如果还没有关联数据 则进行新增

$user->profile()->save(['email' => 'thinkphp']);

~~~

系统会自动把当前模型的主键传入profile模型。

### 关联更新

和新增一样使用`save`方法进行更新关联数据。

~~~

$user = User::get(1);

$user->profile->email = 'thinkphp';

$user->profile->save();

// 或者

$user->profile->save(['email' => 'thinkphp']);

~~~

### 定义相对的关联

我们可以在`Profile`模型中定义一个相对的关联关系,例如:

~~~

namespace app\index\model;

use think\Model;

class Profile extends Model

{

public function user()

{

return $this->belongsTo('User');

}

}

~~~

`belongsTo`的参数包括:

> ### belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');

默认的关联外键是`user_id`,如果不是,需要在第二个参数定义

~~~

namespace app\index\model;

use think\Model;

class Profile extends Model

{

public function user()

{

return $this->belongsTo('User','uid');

}

}

~~~

我们就可以根据档案资料来获取用户模型的信息

~~~

$profile = Profile::get(1);

// 输出User关联模型的属性

echo $profile->user->account;

~~~

## 绑定属性到父模型(`V5.0.4+`)

可以在定义关联的时候使用bind方法绑定属性到父模型,例如:

~~~

namespace app\index\model;

use think\Model;

class User extends Model

{

public function profile()

{

return $this->hasOne('Profile','uid')->bind('nickname,email');

}

}

~~~

或者使用数组的方式指定绑定属性别名

~~~

namespace app\index\model;

use think\Model;

class User extends Model

{

public function profile()

{

return $this->hasOne('Profile','uid')->bind([

'email',

'truename' => 'nickname',

'profile_id'  => 'id',

]);

}

}

~~~

然后使用关联预载入查询的时候,可以使用

~~~

$user = User::get(1,'profile');

// 输出Profile关联模型的email属性

echo $user->email;

echo $user->profile_id;

~~~

绑定关联属性不影响原有关联属性的读取,绑定关联模型的属性支持读取器。

> 如果不是预载入查询,请使用模型的appendRelationAttr方法追加属性。

## 关联自动写入(`V5.0.5+`)

我们可以使用`together`方法更方便的进行关联自动写入操作。

写入

~~~

$blog = new Blog;

$blog->name = 'thinkphp';

$blog->title = 'ThinkPHP5关联实例';

$content = new Content;

$content->data = '实例内容';

$blog->content = $content;

$blog->together('content')->save();

~~~

更新

~~~

// 查询

$blog = Blog::get(1);

$blog->title = '更改标题';

$blog->content->data = '更新内容';

// 更新当前模型及关联模型

$blog->together('content')->save();

~~~

删除

~~~

// 查询

$blog = Blog::get(1);

// 删除当前及关联模型

$blog->together('content')->delete();

~~~

> 如果不想这么麻烦每次调用`together`方法,也可以直接在模型类中定义`relationWrite`属性,但必须是数组方式。不过考虑到模型的独立操作的可能性,并不建议。

一对一课时记录php,一对一关联 · thinkphp5.0 文档学习记录 · 看云相关推荐

  1. Django 4.0文档学习(一)

    本系列文章基于Django4.0版本官方网站文档学习 使用开发工具为pycharm > python -m django --version 4.0 文章目录 编写你的第一个 Django 应用 ...

  2. Beautiful Soup 4.4.0 文档

    Beautiful Soup 4.4.0 文档 文章目录 Beautiful Soup 4.4.0 文档 @[toc] 快速开始 安装 Beautiful Soup 安装完成后的问题 安装解析器 如何 ...

  3. Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档

    Beautiful Soup 4.4.0 文档¶ Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的 ...

  4. 支付宝商户代扣2.0文档

    https://docs.alipay.com/pre-open/20170601105911096277/wob270 支付宝商户代扣2.0文档

  5. Selenium用户指南 - 第一章 Selenium 2.0 文档修订注解

    From: http://blog.csdn.net/planisnothing/article/details/7234995 Selenium 2.0 文档修订注解 你好,欢迎!文档团队欢迎你,并 ...

  6. html如何查看字体样式,css2.0文档查阅及字体样式

    css2.0文档查阅下载     网址:http://soft.hao123.com/soft/appid/9517.html 引入外部样式 这个是正常. 这个是粗体. 这个是粗体 倾斜. varia ...

  7. OAuth 2.0 文档

    OAuth 2.0 文档 初见OAuth2.0 ​ OAuth 2.0是一个业界标准的授权协议,其定义了四种可以适用于各种应用场景的授权交互模式:授权码模式.应用授信模式.用户授信模式.简化模式.其中 ...

  8. 软件测试面试题_每天一道软件测试面试题系列 (八)_描述一次测试用例设计的完整的过程 怎样估计测试工作量?进行测试时产生了哪些文档或记录?

    1.描述一次测试用例设计的完整的过程 回答技巧:     这个问题是考验你在工作前半段是否真的针对你业务进行过测试用例设计,所以回答的时候一定要仔细,并且要从开头讲,也就是从立项会开始讲 答案:    ...

  9. php项目简介,一、项目简介 · ThinkPHP5项目开发“填坑”实录 · 看云

    ###项目简介 [TOC=4,6] 所有的关于技术细节的讨论和实现都是基于一定的项目背景的,所以首先来介绍下我做的项目情况.这里要介绍的项目是一个**作业管理系统**.对你没看错,就是一个简单的学生交 ...

最新文章

  1. qtp9.2测试java_QTP的使用举例说明
  2. java的观察者模式
  3. php编译7教程,LANMP系列教程之php编译安装CentOS7环境
  4. Windows内核新手上路1——挂钩SSDT
  5. 用两张图告诉你,为什么你的App会卡顿?
  6. JAVA数据库连接的另一种实现及简单的数据插入及显示
  7. 不改表结构如何动态扩展字段
  8. Mybatis更新和删除数据
  9. python转弯轨迹_使点沿着曲线轨迹移动
  10. qpython numpy_Python-Numpy全面精简教程
  11. iOS新上线注意事项
  12. 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现
  13. 提高你css技能的css开发技巧
  14. keep it SMPL: Automatic estimation of 3d human pose and shape from a single image
  15. C语言基础知识目录大纲
  16. 【九州贯连智能家居——拥抱华为5.5G,打造未来家居公共物联网关,让生活赋能】
  17. ept技术_速懂X86虚拟化关键概念 - Intel EPT
  18. 【我的新颖社区社交产品架构构思设想】
  19. UIView相对坐标转换
  20. 科研写作之Origin使用心得

热门文章

  1. 培训出来的外包码农一般工资多少
  2. 数据分析方法之描述性统计与推断性统计
  3. Jmeter上传文件的使用
  4. 中标麒麟Linux服务器5.0(mips64el)安装QT开发环境
  5. adb server version (31) doesn't match this client
  6. 结合我的大学经历谈谈如何学习前端
  7. EDT技术 ug - 第四章节Creation of the EDT Logic (持续更新)
  8. 基于Android自带插入器的图形波动效果 --转载自李硕老师博客160303
  9. 警惕! AI 用于诈骗 ...
  10. C语言编程实现求解应力向量,基于MATLAB与Visual+C%2b%2b实现主应力的编程求解.pdf...