laravel的Eloquent关联关系
- 1.简介:
- 1>Eloquent 关联关系以Eloquent模型类方法的形式被定义(是模型类的一个方法)。
- 2>同 Eloquent 模型本身一样,关联关系也是强大的查询构建器,定义关联关系为函数能够提供功能强大的方法链和查询能力(也支持一般的where、get、find等方法。
- $user->posts()->where('active', 1)->get();
- 2.定义关联关系:
- 1>一对一
- 目标:一个User模型有一个与之对应的Phone模型(以User模型为主)
- 实现步骤:
- 1.在User模型中,创建phone()方法
- 2.在phone()方法中,返回 Eloquent 模型基类上的 'hasOne()' 方法的执行结果
- 代码:
- class User extends Model{
- public function phone(){
- return $this->hasOne('App\Phone'); // 参数为 'User模型关联的Phone模型'
- }
- }
- hasOne()方法的3种不同的使用情况:
- Eloquent 默认关联关系的外键基于模型名称。默认是:Phone模型的主键是id,关联的外键是user_id
- 1.hasOne('App\Phone') - 默认情况
- 2.hasOne('App\Phone', 'foreign_key') - Phone模型的主键是id,但是外键不是user_id
- 3.hasOne('App\Phone', 'foreign_key', 'local_key') - Phone模型的主键不是id,外键也不是user_id
- 调用:
- 关联关系被定义后,可以使用 Eloquent 的 '动态属性' 来获取关联关系!
- 注意:
- 动态属性:允许我们访问关联函数,就像它们是定义在模型上的属性一样!
- $phone = User::find(1)->phone; // 理解 '动态属性' 的概念:按理说,我们定义了 phone() 方法,应该调用的是一个方法,而这里将其作为了一个 '属性' 来调用!
- -----------
- 定义相对的关联
- -----------
- 目标:我们可以从User中访问Phone模型,相应的,我们也可以在Phone模型中定义关联关系从而让我们可以拥有该phone的User。
- 实现步骤:
- 1.在Phone模型中,创建user()方法
- 2.在user()方法中,返回 Eloquent 模型基类上的 'belongsTo()' 方法的执行结果
- 代码:
- class Phone extends Model{
- public function user(){
- return $this->belongsTo('App\User'); // 参数为 'Phone模型关联的User模型'
- }
- }
- belongsTo()方法的3种不同的使用情况:
- Eloquent 默认关联关系的外键基于模型名称。默认是:Phone模型的主键是id,关联的外键是user_id
- 1.belongsTo('App\User') - 默认情况
- 2.belongsTo('App\User', 'foreign_key') - Phone模型的主键是id,但是外键不是user_id
- 3.belongsTo('App\User', 'foreign_key', 'local_key') - Phone模型的主键不是id,外键也不是user_id
- 调用:
- $user = Phone::find(1)->user;
- 总结:
- 不管是User模型类,还是Phone模型类,2者都是以 'User' 模型为主。Phone模型还是附属于User模型。Phone模型具有外键 'user_id'
- 2>一对多
- 定义和使用基本同 '一对一' 一样,只是对应的方法改变了,以 '一个帖子,有多个评论' 为例:
- hasMany() - 一个帖子有多个评论
- belongsTo() - 一个评论,必然只针对一个帖子(所以,反过来,它还是 'belongsTo' 方法,并未改变)
- 3>多对多
- 稍微复杂一点。这种关联关系的一个典型例子是:一个用户有多个角色,同时一个角色被多个用户共用。要定义这样的关联关系,需要三个数据表:
- users、roles和role_user,role_user表按照关联模型名的字母顺序命名,并且包含user_id和role_id两个列。
- 实现步骤:
- 1.在User模型中,创建roles()方法
- 2.在roles()方法中,返回 Eloquent 模型基类上的 'belongsToMany()' 方法的执行结果
- 代码:
- class User extends Model{
- public function roles()
- {
- return $this->belongsToMany('App\Role');
- }
- }
- 同样belongsToMany()使用3种方式调用。
- -----------
- 定义相对的关联
- -----------
- 同上面一样,只不过是翻过来了。一样使用的是 'belongsToMany()' 方法
- -------------------------
- 获取中间表的列(本例是:role_user)
- -------------------------
- 假设User对象有很多与之关联的Role对象,访问这些关联关系之后,我们可以使用模型上的pivot属性访问中间表:
- $user = App\User::find(1);
- foreach ($user->roles as $role) {
- echo $role->pivot->created_at; // 每一个 '$role' 角色对象,都有一个 'pivot' 属性
- }
- pivot属性,包含一个代表中间表的模型,并且可以像其它 Eloquent 模型一样使用。
- 如果pivot表包含额外的属性(中间表,包含额外的字段),必须在定义关联关系时指定:
- return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
- pivot表自动包含created_at和updated_at时间戳,在关联关系定义时使用withTimestamps方法:
- return $this->belongsToMany('App\Role')->withTimestamps();
- 4>远层的一对多:
- countries
- id - integer
- name - string
- users
- id - integer
- country_id - integer
- name - string
- posts
- id - integer
- user_id - integer
- title - string
- 目标:
- 查看一个国家有哪些帖子
- 5>多态关联:
- posts
- id - integer
- title - string
- body - text
- comments
- id - integer
- post_id - integer
- body - text
- likes
- id - integer
- likeable_id - integer
- likeable_type - string // post | comment,喜欢的是贴子还是评论
- 目标:
- 查询贴子的喜欢数
- 评论的喜欢数
- 喜欢的这条记录,是贴子还是评论
- 6>多对多的多态关联:
- posts
- id - integer
- name - string
- videos
- id - integer
- name - string
- tags
- id - integer
- name - string
- taggables ------------ 是不是应该还有个 'id' 主键自增字段
- tag_id - integer
- taggable_id - integer
- taggable_type - string
- 目标:
- 贴子的标签
- 视频的标签
- 标签下的所有帖子
- 标签下的所有视频
- 打标签的这条记录,是'什么标签',类型是帖子还是视频
- 3.关联查询:
- 4.插入关联模型:
- http://blog.csdn.net/beyond__devil/article/details/54233539(原贴地址)
laravel的Eloquent关联关系的更多相关文章
- 使用laravel的Eloquent模型获取数据库的指定列
使用laravel的Eloquent模型获取数据库的指定列 使用Laravel的ORM——Eloquent时,时常遇到的一个操作是取模型中的其中一些属性,对应的就是在数据库中取表的特定列. 如果使 ...
- laravel的Eloquent中的get()和Query/Builder中的get()
Eloquent 中的get实际上是Eloquent/Builder中的get,得到的结果是个Collection对象,再调用Collection的first才得到collection中的一项,即一个 ...
- 【laravel】Eloquent 模型事件和监听方式
所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creatin ...
- Laravel笔记--Eloquent 模型
Eloquent 模型 默认继承use Illuminate\Database\Eloquent\Model类. 数据表名称与模型名称约定: 数据库的表名一般使用“蛇形命名法”命名.蛇形命名法要求单词 ...
- laravel通过Eloquent ORM实现CURD
//Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...
- Laravel之Eloquent ORM
一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...
- Laravel使用Eloquent ORM操作数据库
1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...
- Laravel之Eloquent ORM访问器调整器及属性转换
一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...
- Laravel之Eloquent ORM关联
一.一对一 1.主对从(hasOne) 从User模型中取出用户的手机 User模型中: /** * 获取关联到用户的手机 */ public function phone() { return $t ...
随机推荐
- 第二周<岭回归>
传统最小二乘法缺乏稳定性 额.就是曾加正则项 \( argmin||Xw-y||^2+\alpha||w||^2 \) 对应矩阵的求解方法为 \(w=(X^TX+\alpha*I)^{-1}X^Ty\ ...
- oralce管理命令
Emctl start agent TZ set to PRC Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0 Co ...
- CentOS8.0-1905安装配置ftp服务器
关键词:CentOS8/RHEL8;安装配置FTP/安装配置VSFTPD;被动模式/PASV##CentOS8.0-1905发布后,尝试将FTP服务器迁移至新版本的CentOS中,但是测试过程中,在防 ...
- Directx11教程(58) 鼠标控制摄像机
原文:Directx11教程(58) 鼠标控制摄像机 本篇教程我们实现鼠标旋转摄像机的操作.主要就是按下鼠标左键的时候,根据鼠标的移动对摄像机进行pitch, raw的组合旋转.具体修改 ...
- PHPCMS快速建站系列之需要掌握的函数
路径:phpcms\libs\classes\model.class.php /** * 执行sql查询 * @param $where 查询条件[例`name`='$name'] * ...
- MacOS局域网访问Windows7共享文件
配置步骤 Windows7 进入[控制面板]-[网络和共享中心]-[高级共享设置] 启用网络发现 启用文件和打印机共享 选择要共享的文件或文件夹,点击[共享]-[特定用户] 选择Windows7当前登 ...
- 2019-4-10-VisualStudio-2019-尝试使用-C#-8.0-新的方式
title author date CreateTime categories VisualStudio 2019 尝试使用 C# 8.0 新的方式 lindexi 2019-04-10 10:41: ...
- oracle显示和设置环境变量
概述:可以用来控制输出的各种格式. (1)linesize 用于控制每行显示多少个字符,默认80个字符. 基本用法:set linesize 字符数 aql>show linesize sql ...
- 原生js扫雷代码
思路要点: 1. 随机地雷放到一个二维数组中: 2. 每一个格子要统计周围有几颗雷: 3. 每一个格子是否处于打开状态,用于判断是否赢得游戏: 4. 如果点击到周围没有雷的地方,把周围的打开: 具体的 ...
- 2019-2-3-VisualStudio-扩展开发-添加输出窗口
title author date CreateTime categories VisualStudio 扩展开发 添加输出窗口 lindexi 2019-02-03 11:41:40 +0800 2 ...