zoukankan      html  css  js  c++  java
  • laravel 关联关系(1)

    1 一对一关系 hasOne($related, $foreignKey = null, $localKey = null)
    第一个参数是关联模型的类名,
    第二个参数是关联模型类所属表的外键,这里对应的是 user_profiles 表的 user_id 字段,
    第三个参数是关联表的外键关联到当前模型所属表的哪个字段,这里对应的是 users 表的 id 字段。
    注:1、外键保存在关联表中
     
    2 建立相对关联关系 belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null)
    第一个参数是关联模型的类名。
    第二个参数是当前模型类所属表的外键,在本例中是 user_profiles 表的 user_id 字段,拼接规则和 hasOne 那里类似,只不过这里是基于第四个参数关联关系名称 $relation:
    第三个参数是关联模型类所属表的主键:
    第四个参数前面已经说过,默认约定就是关联关系方法名,也是关联关系动态属性名。
    注:1、外键放置在主表中;
     
     
    3 一对多
    建立关联关系
    hasMany($related, $foreignKey = null, $localKey = null)
    建立相对关联关系
    belongsTo(User::class, 'user_id', 'id', 'author') 【将字段修改为author】
     
    4 渴求式加载
    $posts = Post::with('author')
    ->where('views', '>', 0)
    ->offset(1)->limit(10)
    ->get();
    通过with() 方法,采用渴求式加载数据,避免多次请求数据库
     
    5 多对多
    建立关联关系
    表关系:
    post表 ,中间表post_tag, tag表
    belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, $parentKey = null, $relatedKey = null, $relation = null)
    post模型中,建立关联关系:
    return $this->belongsToMany(Tag::class, 'post_tags');
    第一个参数之外,其它参数都可以为空。第一个参数是关联模型的类名。
    第二个参数 $table 是建立多对多关联的中间表名。【默认为post_tag,此处改为post_tags】
    第三个参数是 $foreignPivotKey 指的是中间表中当前模型类的外键,post_id 字段。
    第四个参数 $relatedPivotKey 是中间表中当前关联模型类的外键,tag_id 。
    第五个参数 $parentKey 表示对应当前模型的哪个字段,(即 $foreignPivotKey 映射到当前模型所属表的哪个字段),默认是主键 ID
    第六个参数 $relatedKey 表示对应关联模型的哪个字段(即 $relatedPivotKey 映射到关联模型所属表的哪个字段),默认是关联模型的主键 ID。
    最后一个参数 $relation 表示关联关系名称,用于设置查询结果中的关联属性,默认是关联方法名。
     
    建立相对的关联关系
    return $this->belongsToMany(Post::class, 'post_tags');
    获取中间表字段:
    $post->pivot->tag_id 获取中间表字段值【默认返回主键字段】
    return $this->belongsToMany(Tag::class, 'post_tags')->withTimestamps();【增加获取中间表时间戳】
     
    6 远层一对多关联
    如果我们的博客系统是针对全球市场的话,可能针对不同的国家推出不同的用户系统和功能,然后中国用户过来就只展示中国用户发布的文章,日本用户过来就只展示日本用户发布的文章,这里面涉及到三张表,存储国家的 countries 表,存储用户的 users 表,以及存储文章的 posts 表。用户与文章是一对多的关联关系,这一点我们上篇教程已经说过,国家与用户之间是一对多的关联(一个用户只能有一个国籍),那么通过用户这张中间表,国家和文章之间也建立起来一对多的关联,只是这个关联不是直接的关联,而是「远层」的关联。
    country 模型中添加方法:hasManyThrough
    public function posts()
    { return $this->hasManyThrough(Post::class, User::class);}
    hasManyThrough($related, $through, $firstKey = null, $secondKey = null, $localKey = null, $secondLocalKey = null)
    第一个参数和第二个参数分别是关联模型类和中间模型类。
    第三个参数 $firstKey 表示中间模型类与当前模型类的关联外键,country_id
    第四个参数 $secondKey 指的是中间模型类与关联模型类的关联外键,user_id
    第五个参数 $localKey 默认是当前模型类的主键 ID,第六个参数是中间模型类的主键 ID。
     
     
    7 一对一的多态关联 【间接关联】【建立多态字段,type,id]
    假设在我们的博客系统中用户可以设置头像,文章也可以设置缩略图,我们知道每个用户只能有一个头像,一篇文章也只能有一个缩略图,所以此时用户和图片之间是一对一关联,文章和图片之间也是一对一关联,通过多态关联,我们可以让用户和文章共享与图片的一对一关联,我们只需要在图片模型类通过一次定义,就可以动态建立与用户和文章的关联。
    Images 模型中,添加改方法,用于获取
    imageable_id 和 imageable_type 两个字段
    public function imageable()
    {
    return $this->morphTo();
    }
    morphTo($name = null, $type = null, $id = null, $ownerKey = null)
    第一个参数 $name 是关联关系名称,默认就是关联方法名,在本例中是 imageable。
    第二个参数 $type、
    第三个参数 $id 结合第一个参数 $name 用于构建关联字段,
    最后一个参数是当前模型类的主键 ID。
    注:获取关联imageable_type 中的数据信息
    定义相对的关联关系
    User模型中定义Image关联
    public function image()
    {
    return $this->morphOne(Image::class, 'imageable');
    }
    morphOne($related, $name, $type = null, $id = null, $localKey = null)
    第一个参数表示关联的模型类。
    第二个参数 $name、第三个参数 $type、第四个参数 $id 和前面的 morphTo 方法的前三个参数一样
    最后一个参数 $localKey 表示当前模型类的主键 ID。
     
    8 一对多的多态关联
    1 案例说明:
    博客系统中免不了评论系统,以 Larave 学院为例,它支持两种类型的内容发布,一种是普通的文章,一种是独立的页面,分别存在两张表里。用户可以评论普通文章,也可以评论页面,我们不可能去为不同类型的内容分别创建评论表,因为它们的结构是完全一样的。我们知道如果单独看文章和评论,它们是一对多的关系,现在我们的评论表还要支持页面评论的存储,因此,需要引入一个类型字段做区分,这样,文章/页面与评论之间的关联关系就变成一对多的多态关联了。
    2 模型创建:
    Comment 模型获取对应信息,
    public function commentable()
    { return $this->morphTo();}
    3 定义相对的关联关系:
    Post 模型获取对应comment数据,
    public function comments()
    { return $this->morphMany(Comment::class, 'commentable');}
    morphMany($related, $name, $type = null, $id = null, $localKey = null)
    同 morphOne() 一致
     
    9 多对多的多态关联
    在常规的多对多关联中,中间表只需要一个标签 ID 和文章 ID 即可建立它们之间的关联,但当我们添加新的内容类型,比如页面、视频、音频,它们也有标签,而且完全可以共享一张标签表,此时仅仅一个文章 ID 已经满足不了定义内容与标签之间的关联了,所以此时引入多对多的多态关联,和前面两种多态关联思路一样,只是在多对多关联中,我们需要在中间表中引入类型字段来标识内容类型,将原来的文章ID调整为内容ID,这样就可以从数据库层面满足不同内容类型与标签之间的关联了。
    1 Tag 模型新增方法:
    public function posts()
    { return $this->morphedByMany(Post::class, 'taggable');}
    public function pages()
    { return $this->morphedByMany(Page::class, 'taggable');}
     
    morphedByMany($related, $name, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, $parentKey = null, $relatedKey = null)
    第一个参数 $related 表示关联的模型类。
    第二个参数 $name 表示关联的名称,和定义中间表数据库迁移的时候 morphs 方法中指定的值一致,也就是 taggable。
    第三个参数 $table 表示中间表名称,默认是第二个参数 $name 的复数格式,这里就是 taggables 了,因为我们在创建数据表的时候遵循了这一约定,所以不需要额外指定。
    第四个参数 $foreignPivotKey 表示当前模型类在中间表中的外键,默认拼接结果是 tag_id,和我们在数据表中定义的一样,所以这里不需要额外指定。
    第五个参数 $relatedPivotKey 表示默认是通过 $name 和 _id 组合而来,表示中间表中的关联ID字段,这里组合结果是 taggable_id,和我们定义的一致,也不需要额外指定。
    第六个参数 $parentKey 默认表示当前模型类的主键 ID,即与中间表中 tag_id 关联的字段。
    第七个参数 $relatedKey 表示关联模型类的主键 ID,这个因 $related 指定的模型而定。
     
    定义相对的关联关系
    Post模型添加关联关系
    public function tags()
    { return $this->morphToMany(Tag::class, 'taggable');}
    morphToMany($related, $name, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, $parentKey = null, $relatedKey = null, $inverse = false)
    其中前七个参数和 morphedByMany 方法含义一致,只不过针对的关联模型对调过来,最后一个参数 $inverse 表示定义的是否是相对的关联关系,默认是 false。
     

  • 相关阅读:
    Python3.4 多线程
    OSG Win7 + VS2015 编译
    OSG-3.4.0 简要说明(Readme)
    Boost 1.62.0 编译参数
    VS2015 + QT5.7 中文的坑
    C++库编译
    osg学习笔记3 简单几何模型
    Sqlserver 创建账号
    nginx检查报错:nginx: [emerg] "server" directive is not allowed here in
    Linux修改挂载目录名称
  • 原文地址:https://www.cnblogs.com/sien6/p/13797101.html
Copyright © 2011-2022 走看看