• 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(原贴地址)
  • 相关阅读:
    从 OKR 工作法到 OKRs-E,落地OKR不能错过的转变
    OKR : 不要让目标仅仅成为口号
    [MySQL]Software caused connection abort: recv failed 问题分析与解决
    VS2010 vcpkgsrv.exe进程CPU占用高的解决方法
    Lync Server 2013企业版部署系列之九:前端部署后续工作
    Lync Server 2013企业版部署系列之八:安装lync server系统
    Lync Server 2013企业版部署系列之七:使用拓扑生成器规划拓扑
    Lync Server 2013企业版部署系列之六:AD准备
    Lync Server 2013企业版部署系列之五:前端服务器软件准备
    Lync Server 2013企业版部署系列之四:SQL准备
  • 原文地址:https://www.cnblogs.com/seven-ahz/p/7712044.html
Copyright © 2020-2023  润新知