1. 1.简介:
  2. 1>Eloquent 关联关系以Eloquent模型类方法的形式被定义(是模型类的一个方法)。
  3. 2>同 Eloquent 模型本身一样,关联关系也是强大的查询构建器,定义关联关系为函数能够提供功能强大的方法链和查询能力(也支持一般的where、get、find等方法。
  4. $user->posts()->where('active', 1)->get();
  5. 2.定义关联关系:
  6. 1>一对一
  7. 目标:一个User模型有一个与之对应的Phone模型(以User模型为主)
  8. 实现步骤:
  9. 1.在User模型中,创建phone()方法
  10. 2.在phone()方法中,返回 Eloquent 模型基类上的 'hasOne()' 方法的执行结果
  11. 代码:
  12. class User extends Model{
  13. public function phone(){
  14. return $this->hasOne('App\Phone');       // 参数为 'User模型关联的Phone模型'
  15. }
  16. }
  17. hasOne()方法的3种不同的使用情况:
  18. Eloquent 默认关联关系的外键基于模型名称。默认是:Phone模型的主键是id,关联的外键是user_id
  19. 1.hasOne('App\Phone') - 默认情况
  20. 2.hasOne('App\Phone', 'foreign_key') - Phone模型的主键是id,但是外键不是user_id
  21. 3.hasOne('App\Phone', 'foreign_key', 'local_key') - Phone模型的主键不是id,外键也不是user_id
  22. 调用:
  23. 关联关系被定义后,可以使用 Eloquent 的 '动态属性' 来获取关联关系!
  24. 注意:
  25. 动态属性:允许我们访问关联函数,就像它们是定义在模型上的属性一样!
  26. $phone = User::find(1)->phone;       // 理解 '动态属性' 的概念:按理说,我们定义了 phone() 方法,应该调用的是一个方法,而这里将其作为了一个 '属性' 来调用!
  27. -----------
  28. 定义相对的关联
  29. -----------
  30. 目标:我们可以从User中访问Phone模型,相应的,我们也可以在Phone模型中定义关联关系从而让我们可以拥有该phone的User。
  31. 实现步骤:
  32. 1.在Phone模型中,创建user()方法
  33. 2.在user()方法中,返回 Eloquent 模型基类上的 'belongsTo()' 方法的执行结果
  34. 代码:
  35. class Phone extends Model{
  36. public function user(){
  37. return $this->belongsTo('App\User');     // 参数为 'Phone模型关联的User模型'
  38. }
  39. }
  40. belongsTo()方法的3种不同的使用情况:
  41. Eloquent 默认关联关系的外键基于模型名称。默认是:Phone模型的主键是id,关联的外键是user_id
  42. 1.belongsTo('App\User') - 默认情况
  43. 2.belongsTo('App\User', 'foreign_key') - Phone模型的主键是id,但是外键不是user_id
  44. 3.belongsTo('App\User', 'foreign_key', 'local_key') - Phone模型的主键不是id,外键也不是user_id
  45. 调用:
  46. $user = Phone::find(1)->user;
  47. 总结:
  48. 不管是User模型类,还是Phone模型类,2者都是以 'User' 模型为主。Phone模型还是附属于User模型。Phone模型具有外键 'user_id'
  49. 2>一对多
  50. 定义和使用基本同 '一对一' 一样,只是对应的方法改变了,以 '一个帖子,有多个评论' 为例:
  51. hasMany() - 一个帖子有多个评论
  52. belongsTo() - 一个评论,必然只针对一个帖子(所以,反过来,它还是 'belongsTo' 方法,并未改变)
  53. 3>多对多
  54. 稍微复杂一点。这种关联关系的一个典型例子是:一个用户有多个角色,同时一个角色被多个用户共用。要定义这样的关联关系,需要三个数据表:
  55. users、roles和role_user,role_user表按照关联模型名的字母顺序命名,并且包含user_id和role_id两个列。
  56. 实现步骤:
  57. 1.在User模型中,创建roles()方法
  58. 2.在roles()方法中,返回 Eloquent 模型基类上的 'belongsToMany()' 方法的执行结果
  59. 代码:
  60. class User extends Model{
  61. public function roles()
  62. {
  63. return $this->belongsToMany('App\Role');
  64. }
  65. }
  66. 同样belongsToMany()使用3种方式调用。
  67. -----------
  68. 定义相对的关联
  69. -----------
  70. 同上面一样,只不过是翻过来了。一样使用的是 'belongsToMany()' 方法
  71. -------------------------
  72. 获取中间表的列(本例是:role_user)
  73. -------------------------
  74. 假设User对象有很多与之关联的Role对象,访问这些关联关系之后,我们可以使用模型上的pivot属性访问中间表:
  75. $user = App\User::find(1);
  76. foreach ($user->roles as $role) {
  77. echo $role->pivot->created_at;        // 每一个 '$role' 角色对象,都有一个 'pivot' 属性
  78. }
  79. pivot属性,包含一个代表中间表的模型,并且可以像其它 Eloquent 模型一样使用。
  80. 如果pivot表包含额外的属性(中间表,包含额外的字段),必须在定义关联关系时指定:
  81. return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
  82. pivot表自动包含created_at和updated_at时间戳,在关联关系定义时使用withTimestamps方法:
  83. return $this->belongsToMany('App\Role')->withTimestamps();
  84. 4>远层的一对多:
  85. countries
  86. id - integer
  87. name - string
  88. users
  89. id - integer
  90. country_id - integer
  91. name - string
  92. posts
  93. id - integer
  94. user_id - integer
  95. title - string
  96. 目标:
  97. 查看一个国家有哪些帖子
  98. 5>多态关联:
  99. posts
  100. id - integer
  101. title - string
  102. body - text
  103. comments
  104. id - integer
  105. post_id - integer
  106. body - text
  107. likes
  108. id - integer
  109. likeable_id - integer
  110. likeable_type - string      // post | comment,喜欢的是贴子还是评论
  111. 目标:
  112. 查询贴子的喜欢数
  113. 评论的喜欢数
  114. 喜欢的这条记录,是贴子还是评论
  115. 6>多对多的多态关联:
  116. posts
  117. id - integer
  118. name - string
  119. videos
  120. id - integer
  121. name - string
  122. tags
  123. id - integer
  124. name - string
  125. taggables ------------ 是不是应该还有个 'id' 主键自增字段
  126. tag_id - integer
  127. taggable_id - integer
  128. taggable_type - string
  129. 目标:
  130. 贴子的标签
  131. 视频的标签
  132. 标签下的所有帖子
  133. 标签下的所有视频
  134. 打标签的这条记录,是'什么标签',类型是帖子还是视频
  135. 3.关联查询:
  136. 4.插入关联模型:
  137. http://blog.csdn.net/beyond__devil/article/details/54233539(原贴地址)

laravel的Eloquent关联关系的更多相关文章

  1. 使用laravel的Eloquent模型获取数据库的指定列

    使用laravel的Eloquent模型获取数据库的指定列   使用Laravel的ORM——Eloquent时,时常遇到的一个操作是取模型中的其中一些属性,对应的就是在数据库中取表的特定列. 如果使 ...

  2. laravel的Eloquent中的get()和Query/Builder中的get()

    Eloquent 中的get实际上是Eloquent/Builder中的get,得到的结果是个Collection对象,再调用Collection的first才得到collection中的一项,即一个 ...

  3. 【laravel】Eloquent 模型事件和监听方式

    所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creatin ...

  4. Laravel笔记--Eloquent 模型

    Eloquent 模型 默认继承use Illuminate\Database\Eloquent\Model类. 数据表名称与模型名称约定: 数据库的表名一般使用“蛇形命名法”命名.蛇形命名法要求单词 ...

  5. laravel通过Eloquent ORM实现CURD

    //Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...

  6. Laravel之Eloquent ORM

    一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...

  7. Laravel使用Eloquent ORM操作数据库

    1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...

  8. Laravel之Eloquent ORM访问器调整器及属性转换

    一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...

  9. Laravel之Eloquent ORM关联

    一.一对一 1.主对从(hasOne) 从User模型中取出用户的手机 User模型中: /** * 获取关联到用户的手机 */ public function phone() { return $t ...

随机推荐

  1. php is_null、empty、isset的区别

    isset 判断变量是否已存在 empty 判断变量是否为空或为0 is_null 判断变量是否为NULL 变量 empty is_null isset $a=”” true false true $ ...

  2. vue页面跳转传参

    跳转页 this.$router.push({name:'路由命名',params:{参数名:参数值,参数名:参数值}}) 接收页 this.$route.params.参数名

  3. 阿里云对象存储OSS支持版本管理特性

    阿里云对象存储OSS现已经全面支持“对象版本管理”特性.该功能适用于所有的存储类型以及区域.当Bucket启用该特性后,“对象版本管理”功能可以保护和恢复误删除.误覆盖的数据. 对象存储OSS“版本管 ...

  4. mysql通过日志恢复数据库

    案例:http://www.linuxidc.com/Linux/2012-11/74005.htm http://blog.csdn.net/ssrc0604hx/article/details/1 ...

  5. Oracle日期

    oracle 日期格式 to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. ...

  6. POJ 2632 Crashing Robots (模拟 坐标调整)(fflush导致RE)

    题目链接:http://poj.org/problem?id=2632 先话说昨天顺利1Y之后,直到今天下午才再出题 TAT,真是刷题计划深似海,从此AC是路人- - 本来2632是道略微恶心点的模拟 ...

  7. jsp项目中整个项目没有问题但是servlet报错

    项目没问题但是serverlet报错 项目右键 buildPath-->configure build path -->Myeclipse Library-->J2EE 1.3 Li ...

  8. phpstudy易犯的错误

  9. select筛选用户数据

  10. css的两栏布局

    经典的实现左边固定宽度,右边宽度自适应的几种方法 利用float和margin-left属性(margin-left的值可以稍稍大于或者等于.left的宽度) .left{ width: 30px; ...