laravel的Eloquent关联关系

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